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

EDIT : Aki Suihkonen が提案したように、基本的な頂点シェーダーも追加しました。役に立ちませんでした。

#version 120

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

2 に答える 2

0

また、シェーダー、特にシェーダーコンパイラーでの奇妙な動作も目撃しました。それらは、例えば未使用の変数に対してそれほど寛容ではないようです。または、webGLの場合、Operaのシェーダーコンパイラは、頂点シェーダーとフラグメントシェーダーの両方で特定の変数が使用された場合(そして完全に有効な理由で)もコンパイルしませんでした。

おそらく、デフォルトのシェーダーではなく、頂点シェーダーも含める必要があります。

恐れ入りますが、テクノロジーはまだそれほど成熟していません...

もう1つ、「u_view」はどのように初期化されますか?私はu_viewにコンパイラからのハンドルを割り当てることに慣れているだけです...

于 2012-11-06T17:17:05.677 に答える
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 に答える