2014-09-19 256 views
0

在opengl-es 2.0中,fbo可以渲染为纹理,使用比屏幕大的纹理目标?如果是这样,是否有可能绘制纹理四边形,填补fbo纹理角落?如果不可能的话,是否有可能以另一种方式在opengl-es中做到这一点?我在加载时有一些分层的程序生成的图形,我想将它们组合成单个纹理,以便在绘制时节省性能。Opengl-es绘制纹理

回答

2

是的,绝对。只要纹理具有可呈现颜色的格式(在ES 2.0中只有RGBA4,RGB5_A1RGB565),它可以用作渲染目标。根据GPU的限制,这可能会大大超出显示分辨率。

这意味着您主要受最大纹理大小的限制。您可以使用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)查询该值。

还有另外一个限制。 GL_MAX_VIEWPORT_DIMS定义您可以设置的最大视口大小。您无法渲染到大于这些值的表面。

把他们俩撮合在一起,这将给你可以渲染到纹理的最大尺寸:

GLint maxTexSize = 0; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize); 

GLint maxViewportSize[2] = {0}; 
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportSize); 

GLint maxRenderWidth = maxTexSize; 
if (maxRenderWidth > maxViewportSize[0]) { 
    maxRenderWidth = maxViewportSize[0]; 
} 

GLint maxRenderHeight = maxTexSize; 
if (maxRenderHeight > maxViewportSize[1]) { 
    maxRenderHeight = maxViewportSize[1]; 
} 

使用这些值,你可以创建一个大小maxRenderWidth x maxRenderHeight的纹理,并把它作为一个FBO附件。请记得在开始渲染之前将视口设置为相同的大小。

我检查了来自两个不同主要供应商的GPU的几个平板电脑的限制。在它们两者上,最大纹理尺寸和最大视口尺寸都相同(一个是4096,另一个是8192)。如果这很常见,我不会感到惊讶,但它绝对不能被规范保证。

ES 2.0允许最大纹理尺寸小到64.但是您会发现在最近的任何事情上,限制都会大得多。 2048处于您在任何合理的当前GPU上看到的低端,并且4096/8192很常见。最大视口尺寸保证至少与显示屏一样大。