Java 投影矩阵OpenGL/GLSL问题
我在尝试将投影矩阵应用于GLSL中的对象时遇到问题 以下是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,
#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或出现错误情况。无论哪种方式,这都是不明智的(在大多数情况下)。您可能会遇到一个按零除的错误情况,它阻止着色器完成,给您留下一个空白屏幕。您可能会遇到一个按零除的错误情况,它阻止着色器完成,给您留下一个空白屏幕。