我使用的是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位置而不是統一的位置。
'projection.get'做什麼? [lwjgl Matrix4f](http://legacy.lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html)類不提供此功能。 – BDL
LWJGL版本3擺脫了所有的矩陣運算。我正在使用JOML,Java opengl數學庫。每當你在矩陣上調用get方法時,它將返回該矩陣中的所有內容並將其放入緩衝區,這是opengl需要的大部分函數的數據結構。 –
緩衝器是一個16浮點緩衝器嗎?你應該真的創建一個MVCE,否則我們可以猜測問題出在哪裏。 – BDL