GLSL将输入纹理与目标FBO颜色附件混合

时间:2013-04-16 10:32:20

标签: opengl glsl

我有一个系统允许我为每个可渲染对象设置不同的混合模式(在Photoshop中找到的模式)。目前我所做的是:

  1. 通常将可渲染对象渲染到FBO B中。
  2. 将来自FBO B的混合模式着色器程序,FBO C和混合颜色附件与来自FBO A的颜色附件相连(FBO A包含先前绘制的最终结果)。
  3. 将FBO C中的结果显示为FBO A并继续管道的其余部分。
  4. 虽然这很好用,但我想省去一些目前浪费在乒乓上的帧速率。我知道默认情况下,在写入时不能同时读取像素,所以不可能设置一个纹理来读取和写入?理想情况下,我想要做的是在舞台1渲染几何体直接进入FBO A处理FBO之间的混合颜色附件纹理和输入材质纹理。

    这里说清楚就是这个例子。

    让我们假设所有先前渲染的几何体都在FBO A中累积。每个需要混合的新渲染对象都渲染到FBO B中(就像我上面写的那样)。然后在混合传递中(绘制到FBO C中)使用以下着色器(这里是混合变暗):

    uniform sampler2D bottomSampler;
    uniform sampler2D topSampler;
    uniform float Opacity;
    
    
    // utility function that assumes NON-pre-multiplied RGB...
    vec4 final_mix(
        vec4 NewColor,
        vec4 BaseColor,
        vec4 BlendColor
     ) {
     float A2 = BlendColor.a * Opacity;
     vec3 mixRGB = A2 * NewColor.rgb;
     mixRGB += ((1.0-A2) * BaseColor.rgb);
     return vec4(mixRGB,BaseColor.a+BlendColor.a);
    }
    
    void main(void) // fragment
    {
    vec4 botColor = texture2D(bottomSampler,gl_TexCoord[0].st);
    vec4 topColor = texture2D(topSampler,gl_TexCoord[0].st);
    vec4 comp = final_mix(min(botColor,topColor),botColor,topColor);
        gl_FragColor = comp;
    }
    

    这里:

    uniform sampler2D bottomSampler; - FBO纹理附件。

    uniform sampler2D topSampler; -FBO B纹理附件

    我只使用平面几何对象。

    此着色器的输出是FBO C纹理附件,它将在FBO A中进行下一次演变。

0 个答案:

没有答案