我有一个系统允许我为每个可渲染对象设置不同的混合模式(在Photoshop中找到的模式)。目前我所做的是:
虽然这很好用,但我想省去一些目前浪费在乒乓上的帧速率。我知道默认情况下,在写入时不能同时读取像素,所以不可能设置一个纹理来读取和写入?理想情况下,我想要做的是在舞台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中进行下一次演变。