gpt4 book ai didi

opengl - 渲染到立方体贴图

转载 作者:行者123 更新时间:2023-12-04 02:06:37 30 4
gpt4 key购买 nike

根据 ARB_geometry_shader4可以使用几何着色器和附加到帧缓冲对象的立方体贴图将场景渲染到立方体贴图的 6 个面上。我想用这种方式创建一个阴影贴图。但是,似乎存在我无法解决的冲突:

  • 我只能将 GL_DEPTH_COMPONENT 作为内部类型的纹理附加到 GL_DEPTH_ATTACHMENT_EXT。
  • 深度纹理只能是 1D 或 2D。
  • 如果我想附加一个立方体贴图,所有其他附加的纹理也必须是立方体贴图。

  • 所以当我想渲染到立方体贴图时,看起来我不能使用任何深度测试。或者我到底错过了什么?

    编辑:看起来较新的 Nvidia 驱动程序 (180.48) 支持深度立方体贴图。

    最佳答案

    好的,在这里回答一些其他问题:

    当然,可以使用 6 个 FBO,每个面一个。或者在绘制之前使用一个 FBO 并附加每个面。在这两种情况下,立方体贴图面将被视为任何其他 2D 纹理,您可以将其与普通 2D 纹理或渲染缓冲区一起使用。并且所有可能的方式可能没有太大区别(如果硬件支持它们)。

    但是,也可以一步绘制所有内容,因为我很好奇这是如何完成的,所以我做了一些研究。

    要创建一个将立方体贴图的所有面都附加到单个连接点的 FBO,我使用了以下代码(用 D 编写):

    // depth cube map
    glGenTextures(1, &tDepthCubeMap);
    glBindTexture(GL_TEXTURE_CUBE_MAP, tDepthCubeMap);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT24,
    width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null);
    }

    // color cube map
    glGenTextures(1, &tColorCubeMap);
    glBindTexture(GL_TEXTURE_CUBE_MAP, tColorCubeMap);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA,
    width, height, 0, GL_RGBA, GL_FLOAT, null);
    }

    // framebuffer object
    glGenFramebuffersEXT(1, &fbo);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
    glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, tDepthCubeMap, 0);
    glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tColorCubeMap, 0);

    glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

    if (!isValidFBO()) {
    glDeleteFramebuffersEXT(1, &fbo);
    fbo = 0;
    }
  • 如果您只想拥有深度图,则必须更改 glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);到 glDrawBuffer(GL_NONE);在验证它之前(以及在绘制之前)
  • MIN 和 MAG 过滤器必须设置为有效的(默认为 GL_NEAREST_MIPMAP_LINEAR)
  • 所有纹理的宽度和高度必须相同

  • 要渲染到立方体贴图的面,您需要一个几何着色器。下面的着色器错过了一些旋转,但它的作用应该很清楚。 gl_Layer 用于将图元定向到正确的面(0 = +X,1 = -X,...)。
    #version 120
    #extension GL_EXT_geometry_shader4 : enable

    void main(void) {
    int i, layer;
    for (layer = 0; layer < 6; layer++) {
    gl_Layer = layer;
    for (i = 0; i < 3; i++) {
    gl_Position = gl_PositionIn[i];
    EmitVertex();
    }
    EndPrimitive();
    }
    }

    关于opengl - 渲染到立方体贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/462721/

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