【发布时间】:2014-09-19 15:21:29
【问题描述】:
在 opengl-es 2.0 中,fbo 可以渲染到纹理,使用大于屏幕的纹理目标吗?如果是这样,是否可以绘制一个带纹理的四边形,填充 fbo-texture 角到角?如果不可能,是否可以在 opengl-es 中以另一种方式做到这一点?我在加载时有一些分层的程序生成图形,我想将它们组合成单个纹理,以便在绘制时节省性能。
【问题讨论】:
标签: android opengl-es textures
在 opengl-es 2.0 中,fbo 可以渲染到纹理,使用大于屏幕的纹理目标吗?如果是这样,是否可以绘制一个带纹理的四边形,填充 fbo-texture 角到角?如果不可能,是否可以在 opengl-es 中以另一种方式做到这一点?我在加载时有一些分层的程序生成图形,我想将它们组合成单个纹理,以便在绘制时节省性能。
【问题讨论】:
标签: android opengl-es textures
是的,当然。只要纹理具有可颜色渲染的格式(在 ES 2.0 中只有 RGBA4、RGB5_A1 和 RGB565),它就可以用作渲染目标。根据您的 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 很常见。最大视口尺寸保证至少与显示器一样大。
【讨论】: