【问题标题】:How to update a texture raw content by applying to it an OpenGL Filter?如何通过应用 OpenGL 过滤器来更新纹理原始内容?
【发布时间】:2019-05-01 06:16:18
【问题描述】:

我在安卓下。我有一个纹理 ID,我想更新这个纹理的内容(基本上我想对这个纹理应用一个 OpenGL 过滤器)。注意:我不想在每次绘制纹理时应用 OpenGL 过滤器,我想更改纹理的原始内容(通过对其应用 OpenGL 过滤器)

【问题讨论】:

    标签: android opengl-es textures egl


    【解决方案1】:

    “OpenGL 过滤器”是什么意思?有纹理采样过滤器(GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER 等)。将这些应用于纹理没有任何意义,因为它们定义了在纹理中心之间的区域对纹理进行采样时如何获取数据。 但是,如果您想使用 OpenGL(ES) 管道对纹理应用一些高斯过滤器(或任何其他卷积过滤器),则可以使用称为“渲染到纹理”的概念。这个想法是渲染到纹理对象而不是“可见”默认帧缓冲区。

    在 OpenGL(ES) 中,这可以使用 Framebuffer Objekt(简称 FBO)来完成:

    1. 创建 FBO (glGenFramebuffers)
    2. 绑定FBO (glBindFramebuffer)
    3. 将目标纹理附加到 FBO (glFramebufferTexture2D)
    4. (检查 FBO 是否完整(准备就绪)(glCheckFramebufferStatus)
    5. 设置视口以匹配 FBO 的纹理分辨率

    现在您渲染到目标纹理。只需使用输入纹理绘制一个屏幕填充四边形,结果就会出现在目标纹理中。

    返回默认帧缓冲调用glBindFramebuffer(0)

    一些注意事项:

    • 您不应从正在写入的纹理中读取!所以使用两个不同的纹理对象作为输入和目标纹理!
    • 在此设置中,您将没有深度或模板缓冲区!如果需要,请使用 Renderbuffer 添加一个或将深度纹理附加到 FBO。

    【讨论】:

    • 谢谢!通过 OpenGL 过滤器,我的意思是 EGL 过滤器(进行对比度、模糊等操作的过滤器)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2020-07-30
    相关资源
    最近更新 更多