2013-02-10 44 views
1

我想在屏幕淡出使用GLSL 特定顏色特定顏色到目前爲止,這是我的GLSL代碼,它工作得很好:淡出屏幕使用GLSL

uniform sampler2D textureSampler; 
uniform vec2 texcoordOffset; 
uniform vec3 sp; 
uniform vec3 goal; 
varying vec4 vertColor; 
varying vec4 vertTexcoord; 
void main(void) { 
    vec3 col=texture2D(textureSampler, vertTexcoord.st).rgb; 
    gl_FragColor = vec4(col+((goal-col)/sp), 1.0); 
    //gl_FragColor = vec4(col+((goal-col)*sp), 1.0); //as suggested below also this doesn't solve the problem 
} 

我唯一的問題是, sp值越高,顏色也不會完全消失爲新顏色。我認爲問題是由着色器工作的準確性造成的。 任何人都有一個想法如何提高準確性?

編輯: 難道這種效果是依賴於驅動程序嗎?我正在使用最新驅動程序的ATI,也許有人可以嘗試NVIDIA卡上的代碼?

+0

通常情況下,通過在所有應用混合的情況下渲染四邊形來完成屏幕的淡出。 – 2013-02-10 19:19:26

+0

@NicolBolas無論如何,它看起來像是一個後效果傳球。 – 2013-02-10 19:20:07

+0

@NicolBolas我也試過在所有東西上使用四元組,但問題仍然出現。 – Ranking 2013-02-10 21:16:38

回答

2

讓我們來分析一下:

float A, B: 
float Mix; 

float C = A + (B-A)/Mix; 

現在,它很容易地看到,驢友必須是無限的創造純A,所以它不是GLSL錯的。通常使用的公式如下

float C = A + (B-A) * Mix; 
// Let's feed some data: 
// Mix = 0 -> C = A; 
// Mix = 1 -> C = A + (B - A) = A + B - A = B; 
// Mix = 0.5 -> C = A + 0.5*(B - A) = A + 0.5*B - 0.5*A = 0.5*A + 0.5*B 

正確,對不對?

你的代碼更改爲:

gl_FragColor = vec4(col+((goal-col) * sp), 1.0); 

而在SP利用的<0,1>範圍來代替。另外,不應該sp實際上浮動?如果所有組件都相同(IOW sp.x == sp.y == sp.z),則只需更改其類型即可,如referenced here

+0

我使用的主要計算代碼來自:[鏈接](http://www.wiki.processing.org/w/Fading_the_screen_to_black/any_color) 他們使用位移來實現它,該位移等於除以pow(2,x ) 對? 我試過你的答案,但重影(我認爲效果被稱爲那樣)仍然會出現在值接近0. 並且是sp用作vec3,因爲我想以不同的速度淡化屏幕的顏色。 – Ranking 2013-02-10 21:10:58

+0

@Ranking,對你引用的函數發表評論:** //注意:這個函數目前不工作** – 2013-02-11 09:21:54

+0

它在早期版本的Processing中工作。 後來我改變了它,以便能夠修改淡入淡出速度: 'void fadescr(int r,int g,int b,int spr,int spg,int spb)int red,green,blue; loadPixels(); for(int i = 0; i <像素。長度; i ++){= {pixel [i] >> 16)&0x000000ff; green =(pixels [i] >> 8)&0x000000ff; blue = pixels [i]&0x000000ff; ((+(( - 紅)>> spr))<< 16)|((綠+((g-綠)>> spg))<<(8)|(藍+藍)>> SPB))); } updatePixels(); }' 現在我嘗試在glsl中實現它。有了這個功能,就沒有出現鬼魂。 – Ranking 2013-02-11 14:45:17