Это было мое понимание основных шагов к рендерингу нескольких текстур.
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) Передайте переменные в шейдер, как две наши разные текстуры.
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].