GLSL 120顶点着色器显示比着色器程序更不活跃的制服

时间:2017-03-04 23:54:25

标签: java opengl glsl lwjgl uniform

我使用的是opengl 2.1版,glsl 120,lwjgl 3。 每当我调用GL20.glUniformMatrix4fv()时,它都不会被着色器程序识别。调试后,所有着色器和程序都不会返回任何错误。

立方体被绘制到窗口(因为没有投影它显示为四边形)。 Shader程序编译没有错误并且有效:

#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);

{updated}在调用gluniformmatrix4fv之前输入gluseprogram 屏幕上还没有任何内容。当Identity矩阵被发送到proj然后再乘以vec4时,立方体就会消失。

检查:

GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success);
顶点着色器中的

返回零 在检查时:

GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success);
当在main方法中使用proj和modelView时,着色器程序中的

返回1或2。

[已解决更新] 使用get attrib位置而不是统一位置。

1 个答案:

答案 0 :(得分:0)

OpenGL中的制服是每个程序状态。所有glUniform*()函数都设置当前活动程序对象的制服。你必须先调用glUseProgram才能设置该程序的制服。