11

几天前我找到了 Gwen,并认为它看起来是我项目的完美 GUI 工具包。但是哦,亲爱的,看看渲染器中的所有 OpenGL 2 代码。所以我想我会写一个 OpenGL 3 渲染器,这样我就可以实际使用它了,但我对 CG 比对 GLSL 更熟悉,而且我一直在编写示例。我想如果我可以设置这些统一变量,它应该基本上完成了。

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

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

设置 OpenGL 上下文后调用的着色器初始化代码:

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);
}
4

2 回答 2

29

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

为了渲染一个三角形,OpenGL 需要一个三角形的每个顶点的剪辑空间位置。提供这个是顶点着色器的工作。因为 OpenGL 无法告诉您打算将哪个顶点着色器输出作为剪辑空间位置,所以 OpenGL 要求您将其gl_Position作为输出写入。避免这种情况是合法的,这就是您的着色器编译和链接的原因。但正如您所发现的,渲染失败。

于 2011-09-07T21:23:22.900 回答
3

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

的位置textureSampler是-1的原因是因为你已经注释掉了代码。的位置之所以orthoTransform为-1,是因为它实际上从未被使用和优化出来。片段着色器out outPosition从不使用它,这反过来会导致它orthoTransform被优化掉。

我认为您正在寻找的是gl_Position.

于 2011-09-07T21:26:16.987 回答