gpt4 book ai didi

c++ - 如何使用 OpenGL 渲染到多个纹理?

转载 作者:太空狗 更新时间:2023-10-29 23:03:28 25 4
gpt4 key购买 nike

这是我对渲染到多个纹理的基本步骤的理解。

1) 绑定(bind)要渲染的着色器位置

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) 绑定(bind)到你想要渲染的对象上

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() 将正确纹理的索引绑定(bind)到每个统一槽。

关于c++ - 如何使用 OpenGL 渲染到多个纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com