1

フラグメント シェーダーで 2 つのテクスチャの色を混ぜようとしています。しかし、残念ながら、私はまだ実際の作業の前に立ち往生しています。

シェーダーのセットアップは次のとおりです。

const char* vertex = "void main(){ \n\
                gl_Position = ftransform(); \n\
                        gl_TexCoord[0] = gl_MultiTexCoord0;\n\
                        gl_TexCoord[1] = gl_MultiTexCoord1;\n\
                     }\n";

const char* fragment = "\
                       uniform sampler2D userT;\
                       uniform sampler2D videoTex; \
                       \n\
                       void main(){\n\
                            vec4 texel = texture2D(userT, gl_TexCoord[0].st);\n\
                            gl_FragColor = texel;\n\
                        }\n";

m_vertexShader = glCreateShader(GL_VERTEX_SHADER);
m_fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource( m_vertexShader, 1, &vertex, NULL );
glShaderSource( m_fragmentShader, 1, &fragment, NULL );

glCompileShader( m_vertexShader );
glCompileShader( m_fragmentShader );

m_silhouetteShaderProg = glCreateProgram();
glAttachShader( m_silhouetteShaderProg, m_vertexShader );
glAttachShader( m_silhouetteShaderProg, m_fragmentShader );
glLinkProgram( m_silhouetteShaderProg );

今のところ、フラグメント シェーダーはテクスチャーの 1 つだけを表示します。これは、この場所で両方のテクスチャーが機能するようになれば、後で変更されます。

コンパイルとリンクのエラーを確認しましたが、すべて問題ありません。

そして、ここに私の表示機能があります:

 .... setup of the textures m_videoTexture and m_userPixelTexture with glTexSubImage2D calls ....

glUseProgram( m_silhouetteShaderProg );

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_videoTexture);
GLint videoTexUnif = glGetUniformLocation( m_silhouetteShaderProg, "videoTex" );
glUniform1i( videoTexUnif, 0 );

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_userPixelTexture);
GLint userTexUnif = glGetUniformLocation( m_silhouetteShaderProg, "userT" );
glUniform1i( userTexUnif, 1 );

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glBegin(GL_QUADS);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 0.0f);
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 1.0f*stretch);
    glVertex3f(-0.5f, 0.5f, 0.0f);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 1.0f*stretch);
    glVertex3f(0.5f, 0.5f, 0.0f);
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();

glUseProgram( 0 );
glActiveTexture(GL_TEXTURE0);

私の問題は、「glGetUniformLocation」を使用してフラグメント シェーダー (「userT」) の最初のユニフォームにしかアクセスできないことです。呼び出し: "GLint videoTexUnif = glGetUniformLocation( m_silhouetteShaderProg, "videoTex" );" 「-1」になります。

フラグメント シェーダでユニフォームの順序を変更すると、「videoTex」にはアクセスできますが、「userT」にはアクセスできません。

フラグメント シェーダーで 2 つのユニフォームを使用する例を多数見たので、これは可能であると強く思います。しかし、私はここで何が間違っていますか?

4

1 に答える 1

7

2番目のユニフォームサンプラーは、使用されていないため、GLSLコンパイラーによって最適化されました。リンクされたGLSLプログラムにはそのようなユニフォームがないため、プログラムロジックはそれを考慮に入れる必要があります(コードに基づいてユニフォームを最適化できます)。

于 2011-07-12T15:07:23.223 に答える