2014-09-22 132 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