1

我正在尝试将渲染到纹理概念与立方体贴图纹理一起使用,但不知何故,纹理并未在绘制调用中应用于几何。这是我的代码

#define WIDTH 64
#define HEIGHT 64
glGenTextures(1, &id1);
glBindTexture(GL_TEXTURE_CUBE_MAP, id1);

glGenFramebuffers(1, &Fboid);
for(int i=0;i<6;i++)
{
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

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);


glTexImage2D(types[i], 0, GL_RGBA,WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,0);


}
glBindFramebuffer(GL_FRAMEBUFFER, Fboid);


    for(int i=0;i<6;i++)                      
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,types[i],id1,0);


draw_cube();

glBindFramebuffer(GL_FRAMEBUFFER, 0);

draw();

我已经验证帧缓冲区绑定是否完整。draw_cube() 也可以按预期正确绘制几何图形。当我删除 FBO 并向 glteximage2D() 提供数据时,它会正确地将立方体贴图纹理应用于 draw() 调用中的几何体。宽度高度与 draw_cube 调用中设置的视口相同。

上面的代码有什么问题?

4

1 回答 1

1

很难说究竟什么属于你的for循环体(提示:你的问题的正确格式会有所帮助)。但是,尽管如此,它目前的编写方式根本没有多大意义。

如果它只是语句之后的单行for(目前看起来),那么您将所有立方体面绑定到相同颜色的附件,因此只有最后一个调用 ( types[5]) 将占上风,这看起来很奇怪。如果您打算一次绑定所有六个面(从而draw_cube使用多个渲染目标一次性渲染所有六个面),那么您应该使用GL_COLOR_ATTACHMENT0 + i而不是仅使用GL_COLOR_ATTACHMENT0. 但在这种情况下,根据您的硬件/驱动程序,6 可能会相当高(也就是说:太高)多个活动的多个渲染目标。

但也许该draw_cube调用也属于for-loop(因此分别渲染六个面)。在这种情况下,您应该将其放入循环中:

for(int i=0;i<6;i++)
{
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,types[i],id1,0);
    draw_cube();
}

编辑:正如Nicol Bolas在他的评论中指出的那样,您还可以使用分层渲染并将整个立方体贴图绑定为渲染目标,使用几何着色器输出变量gl_Layer来确定图元应该进入的立方体贴图面。

在这种情况下,您只需调用一次

//note: just ...Texture, without ...2D!
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, id1, 0); 
于 2012-12-06T16:18:26.547 回答