2014-03-31 27 views
0

我用下面的片段着色器,它採用了霧化效果,吸取我的場景:混紡紗線卻不如預期

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); 

結果如下場景:

enter image description here

我的問題是在W中的地方HICH線重疊 - 其結果是,顏色似乎比兩條線的顏色較深:

enter image description here

我怎樣才能解決這個問題?

+0

這是因爲這樣的顏色混合的作品。你畫一條線,然後再畫一條線,等等。最終結果是像素加在幀緩衝區中,使得交叉點看起來更暗。如果你調整了混合函數,我認爲你可以修復它。我不是很顏色混合精通自己,所以我建議你給它一個嘗試一些可用的連擊:http://www.opengl.org/sdk/docs/man/html/glBlendFunc.xhtml – glampert

回答

0

如你共混可能已經含有來自另一個對象的顏色在一定的像素,在你的情況下行重疊的背景的新繪製的線的註釋已經描述的。要解決這個問題,您必須繪製線條而不重疊,或者使繪圖獨立於當前的緩衝區狀態。

在特定情況下,你可以通過一些統一,甚至紋理通過背景色爲您的片段着色器,然後做你的手工混合在片段着色器。

一般來說,你可能要到電網吸取一些幀緩衝對象(FBO)附有質感,然後繪製整機質感使用您的霧着色器和混合單個繪製調用。然後,對FBO的繪圖應該禁用混合。

還有其他的方法,如繪製網格的模板緩存,然後再重新繪製一個全屏幕矩形應用色彩搭配着色器和混合。