glFramebufferTexture2D与立方体贴图纹理

时间:2012-12-06 13:19:10

标签: opengl textures opengl-3 fbo render-to-texture

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

#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()提供数据时,它正确地将cubemap纹理应用于draw()调用中的几何体。宽度高度与draw_cube调用中设置的视口相同。

以上代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

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

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

但也许GL_COLOR_ATTACHMENT0调用也属于draw_cube - 循环(因此单独渲染六个面)。在这种情况下,你应该将它放入循环中:

for

编辑:正如 Nicol Bolas 在评论中指出的那样,您也可以使用分层渲染并使用几何着色器输出变量将整个立方体贴图绑定为渲染目标for(int i=0;i<6;i++) { glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,types[i],id1,0); draw_cube(); } 确定基元应该进入的立方体贴图面。

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

gl_Layer