我的问题非常相似,如果不一样的话: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;
}