Fra*_*era 5 c++ opengl glsl render-to-texture fragment-shader
这是我对渲染多个纹理的基本步骤的理解。
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 );
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
4) 设置着色器程序进行渲染
glUseProgram( m_uiShaderProgramHandle );
Run Code Online (Sandbox Code Playgroud)
5) 将变量传递给着色器,就像我们的 2 个不同纹理一样
glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, uihDiffuseMap );
//or(GL_TEXTURE1)
glActiveTexture( GL_TEXTURE0+1 );
glBindTexture( GL_TEXTURE_2D, uihNormalMap );
Run Code Online (Sandbox Code Playgroud)
6) 进行渲染调用
//Draw stuff
Run Code Online (Sandbox Code Playgroud)
7)将其设置回默认值,以防您有其他渲染过程使用其他东西
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glUseProgram( 0 );
Run Code Online (Sandbox Code Playgroud)
------------------------------------------片段着色器-------------------- -----------------
在片段着色器中,您必须像这样输出 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 );
};
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查过
- 我的漫反射纹理和法线纹理加载得很好。如果我将普通纹理传递为用作 TEXTURE0 的纹理,它将显示出来。-我得到fragColor[0]就好了。当我在屏幕上显示 fragColor[1] 时,我得到了与第一个相同的结果。但我还对 fragColor[1] 进行了硬编码,以在着色器内返回纯灰色作为测试用例,并且它有效。
所以我的假设是,当我将纹理传递给着色器时,它假设“normalMap”是“diffuseMap”?这是我对为什么我会在 fragColor[0] 和 [1] 中得到相同结果的唯一理解。