2017-03-04 83 views
-3

我使用的是opengl 2.1版,glsl 120,lwjgl 3.每當我調用GL20.glUniformMatrix4fv()時,它都不會被着色器程序識別。調試完所有着色器和程序後,不會返回任何錯誤。GLSL 120頂點着色器顯示比着色器程序更少的活動制服

將立方體繪製到窗口上(因爲沒有投影它顯示爲四邊形)。 着色器程序,沒有錯誤編譯和作品:

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

沒有被吸引到窗口。 着色器程序沒有錯誤的編譯,但沒有顯示在屏幕上:

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = proj * vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

片段着色器:

#version 120 
void main() 
{ 
    gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0); 
} 

程序總是鏈接和編譯,但統一的凸出不起作用。

這是統一的數據被髮送代碼:

GL20.glUseProgram(shaderProgram); 
    int model = GL20.glGetAttribLocation(shaderProgram, "modelView");//used get attrib here instead of GL20.glGetUniformLocation(); 
    Matrix4f modelView = new Matrix4f().translate(.5f, .5f, .5f); 
    GL20.glUniformMatrix4fv(model, false, modelView.get(buffer)); 

    int proj = GL20.glGetAttribLocation(shaderProgram, "proj");//and here 
    Matrix4f projection = new Matrix4f(). 
          perspective((float)Math.toRadians(45), 1.0f, 0.1f, 100f). 
          lookAt(0.0f, 0.0f, -3.0f, //eye 
           0.0f, 0.0f, 0.0f, //center 
           0.0f, 1.0f, 0.0f);//up 
    GL20.glUniformMatrix4fv(proj, false, projection.get(buffer)); 

    //draw container 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO); 
    GL11.glDrawArrays(GL_TRIANGLES, 0, 36); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 

{}更新把gluseprogram調用之前gluniformmatrix4fv 還是什麼都沒有被吸引到屏幕上。當標識矩陣被髮送到proj然後乘以vec4立方體消失。

檢查:

GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success); 

在頂點着色器返回零 同時檢查:

GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success); 

在着色器程序返回1或2時凸出和MODELVIEW在主方法被使用。

[解決更新] 正在使用get attrib位置而不是統一的位置。

+0

'projection.get'做什麼? [lwjgl Matrix4f](http://legacy.lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html)類不提供此功能。 – BDL

+0

LWJGL版本3擺脫了所有的矩陣運算。我正在使用JOML,Java opengl數學庫。每當你在矩陣上調用get方法時,它將返回該矩陣中的所有內容並將其放入緩衝區,這是opengl需要的大部分函數的數據結構。 –

+0

緩衝器是一個16浮點緩衝器嗎?你應該真的創建一個MVCE,否則我們可以猜測問題出在哪裏。 – BDL

回答

0

在OpenGL中,每個程序狀態的制服爲。所有glUniform*()函數都設置當前活動程序對象的制服。您必須先致電glUseProgram,然後才能設置該程序的制服。

+0

我曾嘗試在glUseProgram之前和之後,但仍不會改變結果。每當我添加一個統一的mat4並將其乘以主方法時,程序不會在屏幕上繪製任何內容。一切仍然編譯和鏈接沒有任何錯誤。當檢查有多少個gl制服時,glgetshaderiv和glgetprogramiv在mat4處於主要方法中時返回1或2。沒有得到正確繪製。 –

+0

是什麼讓你覺得設定製服是個問題? – derhass

+0

它們是否設置不會改變執行,但是當矩陣乘以矢量時,屏幕上的內容已經消失。我認爲問題在於着色器沒有正確接收制服。由於一切都編譯,我假設mat4與乘以矢量時是空的。 –