除了它不仅限于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;
}
答案 0 :(得分:0)
我还目睹了着色器,特别是着色器编译器的一些奇怪行为。他们似乎并不容忍未使用的变量或者使用webGL Opera的着色器编译器甚至在顶点和片段着色器中使用某个变量时都没有编译(并且出于完全正确的原因)。
也许你应该还包括一个顶点着色器而不是默认的。
我担心,技术还不成熟......
还有一件事:“u_view”如何初始化?我只习惯从编译器中分配u_view句柄...
答案 1 :(得分: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基本上设置一个值有关的值