Как визуализировать несколько текстур с OpenGL?

Это было мое понимание основных этапов рендеринга для нескольких текстур.

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].

3

Решение

Да, на данный момент информация о том, как ваши сэмплеры отображаются на слоты текстуры, отсутствует, в результате чего оба ссылаются на диффузную карту. использование glUniform1i() привязать индекс правильной текстуры к каждому равномерному слоту.

1

Другие решения

Похоже, шаг 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, если они не указаны явно.

0

По вопросам рекламы [email protected]