2013-07-10 71 views
0

我使用的代碼基本未修改,發現here。本網站上的所有其他教程都適合我。然而,當我試圖運行這個時,我最終只得到矢車菊屏幕。glGetUniform意外地返回負值

經過少許挖掘,我發現(使用println跟蹤調試)所有對glGetUniformLocation(從248行開始)的調用都返回負值。鑑於這是一個在LWJGL網站上託管的相當專業的教程,我沒有修改它(除了一些硬編碼的文件路徑,我改變了),我感覺它可能與我的openGL版本有關,我的圖形卡或類似的東西。

在glGetUniformLocation上查找specifics之後,我發現如果你要求一個不存在的或者是錯誤類型的Uniform,它會返回負數。要說明的是這不是我的問題,我將重現這兩個GLSL代碼和調用到glGetUniformLocation這裏:

#version 150 core 

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

in vec4 in_Position; 
in vec4 in_Color; 
in vec2 in_TextureCoord; 

out vec4 pass_Color; 
out vec2 pass_TextureCoord; 

void main(void) { 
    gl_Position = in_Position; 
    // Override gl_Position with our new calculated position 
     gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_Position; 

    pass_Color = in_Color; 
    pass_TextureCoord = in_TextureCoord; 
} 

而且調用:

projectionMatrixLocation = GL20.glGetUniformLocation(pId, "projectionMatrix"); 
viewMatrixLocation = GL20.glGetUniformLocation(pId, "viewMatrix"); 
modelMatrixLocation = GL20.glGetUniformLocation(pId, "modelMatrix"); 
System.out.println(pId+", "+projectionMatrixLocation+", "+ 
    viewMatrixLocation+", "+modelMatrixLocation); 

我缺少什麼?

+1

射擊:刪除第一個'gl_Position'分配和移動第二分配到頂點着色器的最末端。英特爾圖形? – genpfault

+0

*「我發現如果你問一個不存在的或者是錯誤類型的制服,它會返回負值。」 - - 這並不完全正確。它也可以返回存在的統一體的'-1',但不使用*。這就是爲什麼我會第二次* genpfault *的猜測,你的GLSL編譯器可能錯誤地認爲'gl_Position'的第一個賦值是唯一有效的,因此優化掉所有這些矩陣,因爲它們沒有被使用。 –

+0

是的,它正在被優化。你們中的一個人能否將此作爲答案,以便我可以將其標記爲正確? – user2570303

回答

0

考慮爲所有統一數據查詢着色器,以便您可以輕鬆查看制服是否處於活動狀態。這是確切知道的唯一可靠的方法。我在我的着色器類中爲屬性和制服創建內部映射,用於驗證與着色器的所有交互(可以禁用)。

要活躍起來制服的數量:

GLint uniforms; 
glGetProgramiv(programRef, GL_ACTIVE_UNIFORMS, &uniforms); 

對於每個均勻,通過調用glGetActiveUniform獲取名稱和數據類型。

這也包括在:在黑暗中How can I find a list of all the uniforms in OpenGL es 2.0 vertex shader pro