【问题标题】:Opengl-es Drawing to textureOpengl-es 绘制到纹理
【发布时间】:2014-09-19 15:21:29
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es textures


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2013-02-18
      相关资源
      最近更新 更多