如何在OpenGL中使用立方体贴图数组使用阴影贴图渲染多个点光源?

的。马丁

我阅读并实现了以下教程:https : //learnopengl.com/Advanced-Lighting/Shadows/Point-Shadows

现在,我想对其进行概括以在场景中渲染多个点光源,我将如何处理?我听说立方体贴图数组可以用于类似这样的事情,它们如何工作?有人可以给我举个例子吗?

(我正在为自己和子孙后代回答这个问题,因为目前还没有关于Google如何使用多维数据集数组的易于使用的Google教程。)

的。马丁

如果要将多个立方体贴图阴影贴图传递到着色器,并且事先不知道确切多少个立方体贴图数组是一个好的解决方案。它们就像3D纹理一样工作,其中每个图层都是一个立方体贴图。在片段着色器中,您可以为它们创建一个采样器,如下所示:

uniform samplerCubeArray cubeMapArray;

您可以通过以下方式将数组纹理绑定到它:

glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, m_PointLightDepthMaps.m_DepthTexture);

您可以像从多维数据集贴图一样从samplerCubeArray进行采样,但是在这种情况下,矢量会获得第四个元素,即要从中采样的图层。例如:

texture(cubeMapArray, vec4(dir, 3)).r

将从数组中的第四个立方体贴图采样。要创建一个可以用作深度纹理的立方体贴图数组,可以使用以下模板:

void Renderer::initCubemapDepthMap(CubemapDepthMap& map)
{
    glGenTextures(1, &map.m_DepthTexture);
    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, map.m_DepthTexture);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexImage3D(
        GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_DEPTH_COMPONENT, m_ShadowCubeMapResolution, m_ShadowCubeMapResolution, 6 * m_MaxPointLights + 6 * m_MaxSpotLights, 0,
        GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);

    glGenFramebuffers(1, &map.m_FrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, map.m_FrameBuffer);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, map.m_DepthTexture, 0);
    glDrawBuffer(GL_NONE);
    glReadBuffer(GL_NONE);

    const int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE)
    {
        std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!\n";
        throw 0;
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

请注意,您需要使用GL_TEXTURE_CUBE_MAP_ARRAY作为纹理类型,并且需要使用glTexImage3D。调用glTexImage3D时,层数是所需的立方体贴图的数量乘以6,因为每个立方体贴图的面都像单独的图层一样分配。在片段着色器中采样时,无需考虑这一点!

渲染阴影贴图时,您像绑定其他缓冲区一样绑定缓冲区。当您将深度纹理传递给着色器时,您将传递整个立方体贴图数组,而无需弄乱单独的图层。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CUDA立方体贴图纹理

来自分类Dev

如何正确制作用于阴影贴图的深度立方体贴图?

来自分类Dev

LibGDX 0.9.9-在环境中应用立方体贴图

来自分类Dev

使用OpenGL ES在iPhone上渲染到立方体贴图

来自分类Dev

使用移动相机翻转OpenGL立方体贴图反射

来自分类Dev

使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

来自分类Dev

OpenGL:立方体贴图纹理,无UV贴图

来自分类Dev

渲染动态立方体贴图(OpenGL)

来自分类Dev

选择立方体贴图正确面的快速方法?

来自分类Dev

使用现有的2D纹理和glTextureView初始化立方体贴图

来自分类Dev

材质中的Unity更改立方体贴图插槽

来自分类Dev

Unity构建太大的立方体贴图

来自分类Dev

使用帧缓冲区渲染为立方体贴图纹理

来自分类Dev

OpenGL ES 2.0 / 3.0中带有位图的立方体贴图纹理

来自分类Dev

无法同时使用立方体贴图和2D纹理

来自分类Dev

使用立方体贴图时的OpenGL清除缓冲区

来自分类Dev

使用移动相机翻转OpenGL立方体贴图反射

来自分类Dev

OpenGL 4.0立方体贴图问题

来自分类Dev

使用现有的2D纹理和glTextureView初始化立方体贴图

来自分类Dev

OpenGL-将立方体贴图的面渲染为四边形

来自分类Dev

使用帧缓冲区渲染为立方体贴图纹理

来自分类Dev

OpenGL黑色/空白立方体贴图纹理

来自分类Dev

glTextureStorage3D 上的 GL_INVALID_VALUE 与立方体贴图数组

来自分类Dev

动态立方体贴图 - opengl

来自分类Dev

使用带有延迟渲染 Opengl 3.3 的阴影贴图的问题

来自分类Dev

你应该如何在 OpenGL 4.5 中初始化一个立方体贴图数组?

来自分类Dev

OpenGL C++、立方体贴图、顶点着色器

来自分类Dev

OpenGL:渲染天空盒立方体贴图问题

来自分类Dev

OpenGL:天空盒/立方体贴图部分显示,三角形缺失

Related 相关文章

  1. 1

    CUDA立方体贴图纹理

  2. 2

    如何正确制作用于阴影贴图的深度立方体贴图?

  3. 3

    LibGDX 0.9.9-在环境中应用立方体贴图

  4. 4

    使用OpenGL ES在iPhone上渲染到立方体贴图

  5. 5

    使用移动相机翻转OpenGL立方体贴图反射

  6. 6

    使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

  7. 7

    OpenGL:立方体贴图纹理,无UV贴图

  8. 8

    渲染动态立方体贴图(OpenGL)

  9. 9

    选择立方体贴图正确面的快速方法?

  10. 10

    使用现有的2D纹理和glTextureView初始化立方体贴图

  11. 11

    材质中的Unity更改立方体贴图插槽

  12. 12

    Unity构建太大的立方体贴图

  13. 13

    使用帧缓冲区渲染为立方体贴图纹理

  14. 14

    OpenGL ES 2.0 / 3.0中带有位图的立方体贴图纹理

  15. 15

    无法同时使用立方体贴图和2D纹理

  16. 16

    使用立方体贴图时的OpenGL清除缓冲区

  17. 17

    使用移动相机翻转OpenGL立方体贴图反射

  18. 18

    OpenGL 4.0立方体贴图问题

  19. 19

    使用现有的2D纹理和glTextureView初始化立方体贴图

  20. 20

    OpenGL-将立方体贴图的面渲染为四边形

  21. 21

    使用帧缓冲区渲染为立方体贴图纹理

  22. 22

    OpenGL黑色/空白立方体贴图纹理

  23. 23

    glTextureStorage3D 上的 GL_INVALID_VALUE 与立方体贴图数组

  24. 24

    动态立方体贴图 - opengl

  25. 25

    使用带有延迟渲染 Opengl 3.3 的阴影贴图的问题

  26. 26

    你应该如何在 OpenGL 4.5 中初始化一个立方体贴图数组?

  27. 27

    OpenGL C++、立方体贴图、顶点着色器

  28. 28

    OpenGL:渲染天空盒立方体贴图问题

  29. 29

    OpenGL:天空盒/立方体贴图部分显示,三角形缺失

热门标签

归档