Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 投影矩阵OpenGL/GLSL问题_Java_Opengl_Matrix_Lwjgl_Projection - Fatal编程技术网

Java 投影矩阵OpenGL/GLSL问题

Java 投影矩阵OpenGL/GLSL问题,java,opengl,matrix,lwjgl,projection,Java,Opengl,Matrix,Lwjgl,Projection,我在尝试将投影矩阵应用于GLSL中的对象时遇到问题 以下是GLSL代码: #version 330 layout (location = 0) in vec3 pos; uniform mat4 transformationMatrix; uniform mat4 projectionMatrix; out vec4 originalPos; out vec4 transformedPos; out vec4 col; void main(){ col = vec4(pos,

我在尝试将投影矩阵应用于GLSL中的对象时遇到问题

以下是GLSL代码:

#version 330

layout (location = 0) in vec3 pos;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;

out vec4 originalPos;
out vec4 transformedPos;
out vec4 col;

void main(){

    col = vec4(pos, 1);
    originalPos = (projectionMatrix / transformationMatrix) * vec4(pos, 1);

    vec4 newPos = projectionMatrix * vec4(pos, 1);

    transformedPos = newPos;
    gl_Position = newPos;
}   
它在Windows上工作得非常好:

但它在Linux上不起作用:

我确信这是一个与投影矩阵有关的问题,因为如果我省略矩阵应用程序,它就可以正常工作

它与代码和着色器完全相同

使用lwjgl和Java。

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);
对于向量变换来说没有意义。“/”运算符在GLSL中应用于矩阵时,会进行组件范围的除法。您可能需要的是反转,这是一种完全不同的操作。

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);
对于向量变换来说没有意义。“/”运算符在GLSL中应用于矩阵时,会进行组件范围的除法。您可能需要的是反转,这是一种完全不同的操作。

解决方案:

听起来很奇怪,但是:

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);
还有transformationMatrix,它工作得非常好。该代码是对闪电的测试。

解决方案:

听起来很奇怪,但是:

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);

还有transformationMatrix,它工作得非常好。这段代码是对lightning的测试。

您正在检查着色器编译/链接日志吗?你在Linux上使用Mesa吗?如果是,您是否正在创建核心上下文?如果没有,那么您将仅限于OpenGL 3.0功能。其中不包括
#版本330
。在运行着色器之前,您是否检查了代码中的OpenGL错误?也许您正在使用某些在Linux中无法正常工作的Windows特定代码?我正在创建一个核心上下文,并在每个渲染操作结束时执行glGetError()。只是没有错误您正在检查着色器编译/链接日志吗?你在Linux上使用Mesa吗?如果是,您是否正在创建核心上下文?如果没有,那么您将仅限于OpenGL 3.0功能。其中不包括
#版本330
。在运行着色器之前,您是否检查了代码中的OpenGL错误?也许您正在使用某些在Linux中无法正常工作的Windows特定代码?我正在创建一个核心上下文,并在每个渲染操作结束时执行glGetError()。只是没有错误这是添加颜色的代码,不是真的rendering@mcat:没关系。只有在某些情况下才允许对两个矩阵进行除法。因为事情是按组件发生的,给定典型的变换矩阵,你会得到大量的零除法,这可能导致矩阵元素变为NAN或出现错误情况。不管怎样,这都不是明智之举(在大多数情况下)。这是一个添加颜色的代码,不是真的rendering@mcat:没关系。只有在某些情况下才允许对两个矩阵进行除法。因为事情是按组件发生的,给定典型的变换矩阵,你会得到大量的零除法,这可能导致矩阵元素变为NAN或出现错误情况。无论哪种方式,这都是不明智的(在大多数情况下)。您可能会遇到一个按零除的错误情况,它阻止着色器完成,给您留下一个空白屏幕。您可能会遇到一个按零除的错误情况,它阻止着色器完成,给您留下一个空白屏幕。