首页 > 解决方案 > 如何快速翻转 OpenGL ES FBO?

问题描述

版本:Android OpenGL ES 2.0

我使用5个滤镜和FBO渲染位图,每个滤镜都需要位图纹理和位图的蒙版纹理,我的问题是每次滤镜渲染后,下一个滤镜得到的FBO是颠倒的,偶数滤镜上的蒙版和纹理方向相反,我想知道如何在下一个过滤器使用之前快速翻转FBO?

#version 100
precision mediump float;
uniform sampler2D uTexture;
uniform sampler2D uMaskTexture;
varying vec2 vTexCoord;
void main(){
    float mask=texture2D(uMaskTexture, vTexCoord);
    gl_FragColor=texture2D(uTexture*mask, vTexCoord);
}

为了简化问题,这 5 个过滤器与上面的代码类似。uTexture 来自上一个滤镜的 FBO,uMaskTexture 是一个没有任何变化的纹理

标签: opengl-esopengl-es-2.0

解决方案


看来你的纹理坐标是错误的。更正纹理坐标属性。这意味着您必须“翻转”纹理坐标的 y 分量。0变成1,1变成0:

当然这也可以在片段着色器中完成:

void main()
{
    vec2 uv = vec2(vTexCoord.x, 1.0-vTexCoord.y);
    float mask = texture2D(uMaskTexture, uv);
    gl_FragColor = texture2D(uTexture, uv) * mask;
}

或在顶点着色器中:

attribute vec2 aTexCoord;

varying vec2 vTexCoord;

void main
{
    vTexCoord = vec2(aTexCoord.x, 1.0-aTexCoord.y);

    // [...]
}

推荐阅读