0

フレームシェーダオブジェクトにテクスチャ(myTexture)を付けることで、フラグメントシェーダでのぼかし操作を実行しようとしています。それは、このコードで動作します:浮動小数点値を持つフラグメントシェーダのぼかし操作

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
int dep=depth*10; 
for(int i=-dep;i<dep;i++) 
for(int j=-dep;j<dep;j++) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

しかし、私は以下のコードにそれを変更した場合、それは動作does notの(画面が何らかの理由で白になり、私の深さのテクスチャからその読み取りかもしれませんが、私はなぜ知りません)

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
float dep=depth*10; 
for(float i=dep;i<dep;i+=0.2f) 
for(float j=dep;j<dep;j+=0.2f) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

私がオブジェクトの奥行き値に応じてぼかしたいので、これを行う理由です。オブジェクトが遠い場合は、より多くのをぼかします。それは近くにある場合は、以下をぼかします。 最初のコードを使用すると、階段状のぼかしが得られます。つまり、深度が0.3の場合は3回、深度が0.2の場合は2回....... 浮動小数点値を使用して、ぼかし値の代わりに、ステップ値

間のスムーズな移行は、私が間違って何をしているのですか?また、ぼかし値の間のスムーズな移行を得るために他の方法があります。

ありがとうございました。

答えて

0

あなたは2つの問題だ:

  1. sum/40

    の代わりに、一定の40あなたが最初のコードで~(2*10*depth)^2ある加算数で割る必要があると正規化します。第二の符号における第二のコードが間違っている...

  2. 間違ったループ2番目のチャンクの

    結果sum(0,0,0)あるので、あなたがこの上に何かをしている場合を除き、それは黒でなければなりません。

    for(float i=dep;i<dep;i+=0.2f) 
    for(float j=dep;j<dep;j+=0.2f) 
    

    エラーが発生しました。私はあなたの代わりにこれを望んでいたと仮定します。あなたは~(2*10*5*depth)^2

に正常化すべきであるような場合には

for(float i=-dep;i<dep;i+=0.2f) 
for(float j=-dep;j<dep;j+=0.2f) 

関連する問題