我使用以下片段着色器(使用雾效果)绘制场景:
precision mediump float;
uniform int EnableFog;
uniform float FogMinDist;
uniform float FogMaxDist;
varying lowp vec4 DestinationColor;
varying float EyeToVertexDist;
float computeFogFactor()
{
float fogFactor = 1.0;
if (EnableFog != 0)
{
//Use a bit lower vlaue of FogMaxDist to get a better fog effect - it will make the far end disappear quicker.
float fogMaxDistABitCloser = FogMaxDist * 0.98;
fogFactor = (fogMaxDistABitCloser - EyeToVertexDist) / (fogMaxDistABitCloser - FogMinDist);
fogFactor = clamp(fogFactor, 0.0, 1.0);
}
return fogFactor;
}
void main(void)
{
float fogFactor = computeFogFactor();
gl_FragColor = DestinationColor * fogFactor;
}
我启用了alpha混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
结果是以下场景:
我的问题在于线条重叠的位置 - 结果是颜色看起来比两条线的颜色都暗:
我如何解决它?
答案 0 :(得分:0)
正如评论中已经描述的那样,您将新绘制的线条与背景混合,背景可能已包含某些像素的其他对象的颜色,在线条重叠的情况下。要解决此问题,您必须绘制线条而不重叠,或使绘图与当前缓冲区状态无关。
在特定情况下,您可以通过一些均匀或甚至纹理将背景颜色传递给片段着色器,然后在片段着色器中手动进行混合。
通常,您可能希望将网格绘制到具有附加纹理的某个帧缓冲对象(FBO),然后使用雾着色器和混合在单个绘制调用中绘制整个纹理。然后,FBO的绘图应该与禁用混合。
还有其他方法,例如首先将网格绘制到模板缓冲区,然后使用着色器和混合重新绘制全屏矩形应用颜色。