为什么glGetUniformLocation让我失望?

时间:2011-09-07 20:29:50

标签: opengl glsl shader opengl-3

我几天前找到了Gwen,并认为它看起来像是我项目的完美GUI工具包。但是哦,亲爱的,看一下渲染器中的所有OpenGL 2代码。所以我以为我会写一个OpenGL 3渲染器,所以我可以实际使用它,但我比CG更熟悉CG而且我已经让自己陷入了编写样本的困境。我想如果我能够设置这些统一变量,那基本上应该完成。

着色器编译和链接没有问题。我把它缩小到glGetUniformLocation,为正交矩阵和纹理采样器返回-1,但我不知道为什么它正在这样做。典型的问题似乎是如果你实际上没有使用它们,它们会被优化出来,但我已经将它们都用了。

如果有人有任何想法,我会全力以赴。一旦它正常工作,将非常乐意发布/链接完整的东西。这是我对GLSL的第一次尝试,所以我很容易做一些愚蠢的事情。我刚刚完成为另一个项目设置CG,所以我不是完全无能为力。

在设置OpenGL上下文后调用Shader Init代码:

void InitializeShaders(void)
{
    g_ShaderProgram = glCreateProgram();
    g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
    g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
    glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);

    glCompileShader(g_VertexShader);
    CheckShaderCompile(g_VertexShader);

    glCompileShader(g_FragmentShader);
    CheckShaderCompile(g_FragmentShader);

    glAttachShader(g_ShaderProgram, g_VertexShader);
    glAttachShader(g_ShaderProgram, g_FragmentShader);

    glBindAttribLocation(g_ShaderProgram, 0, "position");
    glBindAttribLocation(g_ShaderProgram, 1, "color");
    glBindAttribLocation(g_ShaderProgram, 2, "texCoord");

    glBindFragDataLocation(g_ShaderProgram, 0, "color");

    glLinkProgram(g_ShaderProgram);
    CheckShaderLink();

    g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
    g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}

着色器作为字符串存储在头文件中,但是我删除了所有换行符和反斜杠,因此看起来不那么痛苦。

顶点着色器:

#version 330

in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{
    outPosition = position * orthoTransform;
}

片段着色器:

#version 330

in vec2 texCoord;
in vec4 color;
out vec4 outColor;
uniform sampler2D textureSampler;
void main(void)
{
    //outColor = texture(textureSampler, texCoord) * color;
    outColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

2 个答案:

答案 0 :(得分:29)

问题非常简单:你的顶点着色器什么都不做,所以OpenGL正在优化它。

为了渲染三角形,OpenGL需要每个三角形顶点的剪辑空间位置。顶点着色器的工作就是提供这个功能。由于OpenGL无法分辨您想要作为剪辑空间位置的顶点着色器输出,因此OpenGL要求您将gl_Position作为输出写入。避免这种情况是合法的,这就是你的着色器编译和链接的原因。但正如您所发现的,渲染失败。

答案 1 :(得分:3)

首先,在这种情况下,glBindFragDatalocation应该绑定outColor而不是color。其次,您为着色器程序提供的是顶点属性,而不是片段属性。顶点着色器的out应与片段着色器的in匹配。

textureSampler的位置为-1的原因是您已注释掉代码。 orthoTransform的位置为-1的原因是因为它实际上从未被使用和优化过。片段着色器从不使用out outPosition,这样可以优化orthoTransform制服。

我认为你要找的是gl_Position