3

我的问题非常相似,如果不一样的话:http ://www.opengl.org/discussion_boards/showthread.php/169185-glUniform1f()-seems-broken-where-is-the-error

除了它不仅限于 glUniform1f 函数。基本上,任何传递给 GLSL 程序的制服都会无缘无故地获得一个总垃圾值。对 glGetUniformfv 的调用也证实了这一点。将预期值硬编码到着色器中会产生预期的结果。什么可能出错?

除了提供的链接外,我无法找到有关此主题的任何相关信息,这对我没有任何帮助。

C代码:

void display(void) {
    double time = get_time() - g_starttime;
    double delta = time - g_lasttime;

    printf("%f [%f]\n", time, delta);    

    GLint m_viewport[4];
    glGetIntegerv(GL_VIEWPORT, m_viewport);
    printf("%i, %i, %i, %i\n", m_viewport[0], m_viewport[1], m_viewport[2], m_viewport[3]);

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 1.0f, 1.0f);
    glUseProgram(g_prog);
    glUniform2f(u_view, (float)m_viewport[2], (float)m_viewport[3]);
    glUniform1f(u_time, (float)time);
    glRectf(-1.0f, 1.0f, 1.0f, -1.0f);
    glUseProgram(0);
    glutSwapBuffers();
    glutPostRedisplay();

    g_lasttime = time;
}

GLSL 片段着色器(没有顶点着色器):

#version 120

uniform vec2 view;
uniform float time;

void main(void) {
    vec2 pos = vec2(gl_FragCoord);
    gl_FragColor = vec4(pos.x/view.x, 0.0, 0.0, 1.0);
}

编辑:我还添加了一个基本的顶点着色器,正如 Aki Suihkonen 建议的那样。它没有帮助。

#version 120

void main(void) {
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}
4

2 回答 2

0

您可能已经解决了这个问题,但您可能需要在设置制服之前添加一些检查:

当您获得统一的索引时,如果不使用统一并且已被编译器优化,则它可能会失败。在 u_time 的测试用例中没有使用。下面是获取统一索引的示例函数。仅当您可以获得有效位置时才设置制服的值(即它正在使用或尚未优化)

bool findUniformLocation( const String& name, UInt32& location )
    {
        printGLSLLog(m_program);
        CHECK_GL_ERROR;
        location = (UInt32)glGetUniformLocation( m_program, name.c_str() );

        printGLSLLog(m_program);
        CHECK_GL_ERROR;

        return ( location != (UInt32)-1 );
    }

因此,垃圾可能是由您在 u_time 上设置的值引起的,该值是不正确的索引,或者可能与 u_view 本质上设置垃圾值相同

于 2013-02-22T10:35:44.977 回答
0

我还目睹了着色器,尤其是着色器编译器的一些奇怪行为。他们似乎对未使用的变量没有那么宽容。或者使用 webGL Opera 的着色器编译器甚至在顶点着色器和片段着色器中都使用某个变量时甚至没有编译(并且出于完全正当的理由)。

也许您还应该包含一个顶点着色器而不是默认着色器。

恐怕技术还没有那么成熟...

还有一件事:“u_view”是如何初始化的?我只习惯于为 u_view 分配一个来自编译器的句柄......

于 2012-11-06T17:17:05.677 回答