Невозможно использовать две одинаковые переменные в GLSL Fragment Shader (работает только первая)
Я пытаюсь смешать цвета двух текстур в фрагментном шейдере. Но, к сожалению, я застрял перед настоящей работой еще.
Вот настройка шейдера:
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);
Моя проблема в том, что я могу получить доступ только к первой униформе моего фрагментного шейдера ("userT") с помощью "glGetUniformLocation". Вызов: "GLint videoTexUnif = glGetUniformLocation( m_silhouetteShaderProg, "videoTex");" результаты в "-1".
Если я изменяю порядок униформы в фрагментном шейдере, я могу получить доступ к "videoTex", но не к "userT".
Я видел много примеров использования двух униформ в фрагментном шейдере, поэтому я настоятельно полагаю, что это возможно. Но что я здесь делаю не так?
1 ответ
Ваш второй унифицированный сэмплер был оптимизирован компилятором GLSL, потому что он не используется. В связанной GLSL-программе нет такой униформы, поэтому логика вашей программы должна учитывать это (любая униформа может быть оптимизирована на основе вашего кода).