根据 ARB_geometry_shader4 它能够呈现一个到现场的6面临的一个立方体地图上的几何形状色器和对立方的地图附于一个帧缓冲的对象。我想创建一个阴影地图使用这种方式。然而似乎有一种冲突,我不能解决:

  1. 我只可附加一个纹理与GL_DEPTH_COMPONENT作为内部类型的GL_DEPTH_ATTACHMENT_EXT.
  2. 一个深入的纹理只能1D或2D。
  3. 如果我要附加一个立方体的地图,所有其他附纹理都必须立方的地图。

因此它看起来像我不能使用的任何深度测试的时候我想要呈现为一个立方体的地图。或是什么我丢在这里?

编辑: 它看起来像新的选司机(180.48)支持深入立方的地图。

有帮助吗?

解决方案

Ok,回答一些其他问题:

当然这是可能使用6宗教组织,每个脸。或者采用一个固定运营基地,并附上每一个面临之前你吸引到它。在这两种情况下立体图的脸会像对待任何其他2D纹和你可以一起使用的正常2D纹理或Renderbuffers.并有可能没有太大的差异,在所有可能的方式(如果硬件支持)。

然而,它也可能得出的一切中的一个步骤,因为我是好奇的是如何这样做,我做了一些研究。

创建一个固定运营基地与所有面临的一个立方体地图附于一个单一的连接点,我用这个代码(编写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();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top