2014-09-22 162 views
0

我在试图将投影矩阵应用于GLSL中的对象时遇到问题。投影矩阵OpenGL/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上: Rendering on Windows

但它不工作在Linux上: Rendering on Linux

我知道肯定是某种与投影矩阵有关的问题,因为如果我省略了矩阵应用程序,它工作得很好。

它是完全相同的代码和着色器。

使用lwjgl和Java。

+1

你在检查着色器编译/链接日志吗?你在Linux上使用Mesa吗?如果是这样,你是否创建了一个Core上下文?如果没有,那么你将仅限于OpenGL 3.0功能。哪个*不包含'#version 330'。 – genpfault 2014-09-22 17:15:54

+0

在运行着色器之前,你检查过OpenGL错误代码吗?也许你正在使用一些Windows特定的代码,在Linux中无法正常工作? – Dan 2014-09-22 17:16:16

+0

我正在创建一个Core上下文,并在每个渲染操作结束时执行glGetError()。只是没有错误 – mcat 2014-09-22 17:28:40

回答

4

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

是没有意义的,对于一个矢量变换。 '/'运算符在GLSL中应用于矩阵时会执行组件范围的划分。你可能想要通过的是反转,这是一个完全不同的操作。

+0

这是一个添加颜色的代码,不是真正的渲染 – mcat 2014-09-22 17:27:01

+0

@mcat:没关系。只有在某些情况下才允许分割两个矩阵。任何因为事情发生组件明智,给定典型的转换矩阵,你得到很多的零分,这可能导致矩阵元素成为南或错误条件。无论哪种方式,这是不明智的做法(在大多数情况下)。 – datenwolf 2014-09-22 18:00:17

0

解决方案:

这听起来不可思议,但删除:

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

和transformationMatrix,它的工作原理完全没问题。该代码是闪电测试。

+1

您可能会碰到一个零错误条件的分割,这会导致着色器无法完成,从而使您空白屏幕。 – datenwolf 2014-09-22 18:00:48