0

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

  1. 将可渲染对象正常渲染到 FBO B 中。
  2. 附加混合模式着色器程序 FBO C ,并将 FBO B 的颜色附件与 FBO A 的颜色附件混合(FBO A 包含先前绘制的最终结果)。
  3. 将结果从 FBO C 传输到 FBO A 并继续处理管道的其余部分。

虽然这很好用,但我想节省一些目前浪费在这个乒乓球上的帧速率。我知道默认情况下,在写入像素时不可能同时读取像素,因此无法设置读取和写入的纹理?理想情况下,我想做的是在第 1 阶段将几何图形直接渲染到 FBO A 中,处理 FBO A 颜色附件纹理和输入材质纹理之间的混合。

为了清楚起见,这里举个例子。

假设所有先前渲染的几何体都累积在 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;
}

这里 :

统一采样器2D 底部采样器;- FBO 纹理附件。

统一的sampler2D topSampler;-FBO B 纹理附件

我只使用平面几何对象。

此着色器的输出是 FBO C 纹理附件,它被 blitted 到 FBO A 以进行下一次演进。

4

0 回答 0