Opengl-es绘制到纹理

时间:2014-09-19 15:21:29

标签: android opengl-es textures

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

1 个答案:

答案 0 :(得分:2)

是的,绝对的。只要纹理具有颜色可渲染格式(在ES 2.0中只有RGBA4RGB5_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很常见。最大视口尺寸保证至少与显示器一样大。