Это было мое понимание основных этапов рендеринга для нескольких текстур.
1) Свяжите местоположения шейдера для рендеринга в
m_uihDiffuseMap = glGetUniformLocation( m_iShaderProgramHandle, "diffuseMap" );
if( m_uihDiffuseMap != -1 )
glUniform1i( m_uihDiffuseMap, 0 );
m_uihNormalMap = glGetUniformLocation( m_iShaderProgramHandle, "normalMap" );
if( m_uihNormalMap != -1 )
glUniform1i( m_uihNormalMap, 1 );
2) Привязать к тому, что вы хотите сделать
glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle );
//diffuse texture binding
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_uiTextureHandle1, 0);
//normal texture binding
(or GL_COLOR_ATTACHMENT1)
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+1, m_uiTextureHandle2, 0);
3) Очистить буфер & укажите, какие буферы вы хотите использовать
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
4) Установите шейдерную программу для рендеринга
glUseProgram( m_uiShaderProgramHandle );
5) Передайте переменные в шейдер, как наши 2 разные текстуры
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, uihDiffuseMap );
//or(GL_TEXTURE1)
glActiveTexture( GL_TEXTURE0+1 );
glBindTexture( GL_TEXTURE_2D, uihNormalMap );
6) сделать вызов вещи
//Draw stuff
7) установить вещи обратно по умолчанию, если у вас есть другие процедуры рендеринга, используя другие вещи
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glUseProgram( 0 );
——————————ФРАГМЕНТНАЯ ШЕЙДЕР ————————————
Во фрагментном шейдере вы должны вывести 2 результата, как это верно?
#version 330
in vec2 vTexCoordVary;
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
out vec4 fragColor[2];
void main( void )
{
fragColor[0] = texture( diffuseMap, vTexCoordVary );
fragColor[1] = texture( normalMap, vTexCoordVary );
};
Я дважды проверил
-Моя диффузная текстура и обычная текстура загружены нормально. Если я передам свою обычную текстуру в качестве текстуры для использования в качестве TEXTURE0, она появится.
-Я получаю fragColor [0] просто отлично. Когда я показываю fragColor [1] на экране, я получил тот же результат, что и первый. Но я также жестко запрограммировал fragColor [1], чтобы вернуть сплошной серый цвет внутри шейдера в качестве тестового примера, и это сработало.
Итак, я предполагаю, что когда я передаю свои текстуры шейдеру, предполагается, что «normalMap» — это «diffuseMap»? Это мое единственное понимание того, почему я получу тот же результат в fragColor [0] и [1].
Да, на данный момент информация о том, как ваши сэмплеры отображаются на слоты текстуры, отсутствует, в результате чего оба ссылаются на диффузную карту. использование glUniform1i()
привязать индекс правильной текстуры к каждому равномерному слоту.
Похоже, шаг 1 и шаг 4 находятся в неправильном порядке. Это на шаге 1:
if( m_uihDiffuseMap != -1 )
glUniform1i( m_uihDiffuseMap, 0 );
if( m_uihNormalMap != -1 )
glUniform1i( m_uihNormalMap, 1 );
и это на шаге 4:
glUseProgram( m_uiShaderProgramHandle );
glUniform*()
вызовы относятся к текущей активной программе. Так glUseProgram()
должен быть назван до glUniform1i()
звонки.
Это также может быть хорошей идеей, чтобы указать местоположение out
переменная:
layout(location = 0) out vec4 fragColor[2];
Я не думаю, что это вызывает вашу проблему, но я не вижу ничего в спецификации, говорящей, что компоновщик назначает местоположения, начинающиеся с 0, если они не указаны явно.