【问题标题】:GLSL 120 vertex shader showing less active uniforms than shader programGLSL 120 顶点着色器显示的活动制服比着色器程序少
【发布时间】:2017-03-04 23:54:25
【问题描述】:

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

一个立方体被绘制到窗口上(因为没有投影,它显示为一个四边形)。 编译没有错误并且可以工作的着色器程序:

#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 仍然没有任何东西被绘制到屏幕上。当单位矩阵被发送到 proj 然后乘以 vec4 立方体消失了。

检查:

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

在顶点着色器中返回零 检查时:

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

在 main 方法中使用 proj 和 modelView 时,shader 程序中返回 1 或 2。

[已解决的更新] 正在使用获取属性位置而不是获取统一位置。

【问题讨论】:

  • projection.get 是做什么的? lwjgl Matrix4f 类不提供此功能
  • LWJGL 版本 3 去掉了所有的矩阵数学。我正在使用 JOML,Java opengl 数学库。每当您在矩阵上调用 get 方法时,它将返回该矩阵中的任何内容并将其放入缓冲区中,这是 opengl 对其大多数功能所需的数据结构。
  • buffer 是 16 浮点缓冲区吗?你真的应该创建一个 MVCE,否则我们只能猜测问题出在哪里。
  • 缓冲区是一个 16 浮点缓冲区。

标签: java opengl glsl lwjgl uniform


【解决方案1】:

Uniforms 在 OpenGL 中每个程序状态。所有glUniform*() 函数设置当前活动的程序对象 的制服。您必须先致电glUseProgram,然后才能设置该程序的制服。

【讨论】:

  • 我尝试在之前和之后放置 glUseProgram,但这仍然不会改变结果。每当我在 main 方法中添加一个统一的 mat4 并将其相乘时,程序不会在屏幕上绘制任何内容。一切仍然编译和链接没有任何错误。当检查有多少个 gl 制服时,当 mat4 在 main 方法中时,glgetshaderiv 和 glgetprogramiv 返回 1 或 2。没有正确绘制。
  • 是什么让您认为设置制服是问题所在?
  • 是否设置它们不会改变执行,但是当将矩阵乘以向量时,之前屏幕上的内容就消失了。我认为问题在于着色器没有正确接收制服。由于一切都可以编译,我假设 mat4 在乘以向量时为空。
  • 发生这种情况的原因有很多。只有在程序处于活动状态时才能设置制服本身,在您的原始程序中肯定存在该错误。可能还有其他人。
  • 您应该添加更多相关代码,使其成为MCVE。目前,很难确定错误的确切位置。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多