私の問題は、これと同じではないにしても、非常に似ています: 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);
}
EDIT : Aki Suihkonen が提案したように、基本的な頂点シェーダーも追加しました。役に立ちませんでした。
#version 120
void main(void) {
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}