【问题标题】:Updating a texture in OpenGL with glTexImage2D使用 glTexImage2D 在 OpenGL 中更新纹理
【发布时间】:2012-04-09 11:24:10
【问题描述】:

glTexImage2DglTexSubImage2D 将像素缓冲区传递给纹理的唯一方法吗?

目前我在设置函数中使用 glTexImage2D 将 null 作为缓冲区传递,然后在渲染循环中,我在每次迭代时使用新的缓冲区数据调用 glTexSubImage2D .

但是知道纹理不会改变任何属性(例如尺寸),有没有更有效的方法将实际像素数据传递给渲染纹理?

【问题讨论】:

    标签: textures glteximage2d


    【解决方案1】:

    在现代OpenGL 中有 4 种不同的方法来更新 2D 纹理:

    1. glTexImage2D - 最慢的一个,重新创建内部数据结构。

    2. glTexSubImage2D - 快一点,但不能改变图片的参数(大小,像素格式)。

    3. 使用FBO 渲染到纹理 - 完全在 GPU 上更新纹理,非常快。有关详细信息,请参阅此答案:https://stackoverflow.com/a/10702468/1065190

    4. 像素缓冲区对象PBO - 用于从 CPU 到 GPU 的快速上传,OpenGL ES 尚不支持。

    【讨论】:

    • 我看到 FBO 是最好的选择,但是,我的纹理需要使用 GL_LUMINANCE 参数,而我刚刚发现 FBO 不支持这样的参数。那么是使用 glTexSubImage2D 的唯一选择吗?
    • 你使用桌面 OpenGL 还是 OpenGL ES?
    • 在 Android 上使用 OpenGL ES。使用 GL_LUMINANCE 的原因是我必须将 YUV420sp 数据传递到着色器中,因为我对 glTexSubImage2D 进行了 2 次调用以传递 2 个平面,一个用于 Y,另一个用于 UV。因此我必须使用 GL_LUMINANCE。出于速度原因,在将数据传递给着色器之前将 YUV 转换为 RGB 的选项不是一个选项。
    • 您必须比较渲染成 RGB FBO 与 TexSubImage2D/GL_LUMINANCE 的性能。如果 RGB FBO 更快 - 只需使用它。如果不是 - 使用 TexSubImage2D。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多