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つのユニフォームを使用している例がたくさんありましたので、これが可能であることを強く想定しています。しかし、私はここで間違って何をしていますか?
うわー、それは簡単でした!この愚かな質問にお答えいただきありがとうございます! :-) – Valerie