2011-07-12 7 views
0

2つのテクスチャの色をフラグメントシェーダで混合しようとしています。しかし残念ながら私は実際の仕事の前に立ち往生しています。ここでGLSL Fragment Shaderで2つの統一変数を​​使用できません(最初の作品のみ)

は、シェーダのセットアップです:今、フラグメントシェーダだけtxturesのいずれかを表示するために

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

私はこの場所での作業の両方のテクスチャを取得する場合、これは、後から変更されます。

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

そして、ここに私の表示機能である:

.... 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つのユニフォームを使用している例がたくさんありましたので、これが可能であることを強く想定しています。しかし、私はここで間違って何をしていますか?

答えて

6

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

+0

うわー、それは簡単でした!この愚かな質問にお答えいただきありがとうございます! :-) – Valerie

関連する問題