这是我对于多纹理渲染的基本步骤的理解。
1)绑定着色器位置以进行渲染。
我已经仔细检查了:
- 我的漫反射贴图和法线贴图都加载正常。如果我将我的法线贴图作为使用TEXTURE0的纹理传递,它将显示出来。 - 我可以很好地获取fragColor [0]。当我将fragColor [1] 显示在屏幕上时,我得到的结果与第一个颜色相同。但是我还在着色器中硬编码了fragColor [1]以返回实心灰色作为测试用例,并且测试通过。
因此,我的假设是当我将纹理传递给着色器时,它会认为“normalMap”是“diffuseMap”? 这是我唯一能想到的原因,为什么在fragColor [0]和[1]中得到相同的结果。
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]中得到相同的结果。