繁体   English   中英

Opengl-es绘制纹理

[英]Opengl-es Drawing to texture

在opengl-es 2.0中,fbo能否渲染到纹理,使用大于屏幕的纹理目标? 如果是这样,是否可以绘制带纹理的四边形,以将fbo纹理的角填满? 如果不可能,是否可以在opengl-es中以其他方式执行此操作? 我在加载时有一些过程化生成的图形,我想将它们合并为单个纹理,以节省绘制时的性能。

是的,一点没错。 只要纹理具有可渲染颜色的格式(在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很常见。 保证最大视口尺寸至少等于显示器的尺寸。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM