2012-04-24 2 views
0

私は注意書きを組み込もうとしましたが、失敗しました。OpenGL shader lssue

拡散したアンビエント、スペキュラの照明があります。私は断片が光から遠ざかるにつれて光を薄暗くする必要があります。

はまた、私は私の光に対する減衰パラメータがあります。

glLightf(GL_LIGHT0、GL_QUADRATIC_ATTENUATION、0.0004fを)。

これは、光がちょうどキューブの背後に配置され、床照明である:

http://oi43.tinypic.com/i39fuo.jpg

.vert

varying vec3 N; 
varying vec3 v; 
varying vec3 c; 
varying float dist; 

void main(void) 
{ 
vec4 ecPos; 
vec3 aux; 

ecPos = gl_ModelViewMatrix * gl_Vertex; 
aux = vec3(gl_LightSource[0].position-ecPos); 
dist = length(aux); 

c = vec3(gl_Color); 
v = vec3(gl_ModelViewMatrix * gl_Vertex);  
N = normalize(gl_NormalMatrix * gl_Normal); 
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

.frag

varying vec3 N; 
varying vec3 v; 
varying vec3 c;  
varying float dist; 

void main (void) 
{ 
float att; 

att = 1.0/(gl_LightSource[0].constantAttenuation + 
      gl_LightSource[0].linearAttenuation * dist + 
      gl_LightSource[0].quadraticAttenuation * dist * dist); 

vec3 L = normalize(gl_LightSource[0].position.xyz - v); 
vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0) 
vec3 R = normalize(-reflect(L,N));  

float nDotL = max(dot(N,L), 0.0); 
float rDotE = max(dot(R,E),0.0); 
float power = pow(rDotE, gl_FrontMaterial.shininess); 

//calculate Ambient Term: 
vec4 Iamb = gl_FrontLightProduct[0].ambient * att;   

//calculate Diffuse Term: 
vec4 Idiff = gl_FrontLightProduct[0].diffuse * nDotL * att; 
Idiff = clamp(Idiff, 0.0, 1.0);  

// calculate Specular Term: 
vec4 Ispec = gl_FrontLightProduct[0].specular * power * att; 
Ispec = clamp(Ispec, 0.0, 1.0); 

// write Total Color: 
gl_FragColor = Iamb + Idiff + Ispec + c; 
} 
+0

[GLSL - 減衰が動作しない]の可能複製ここ(http://stackoverflow.com/questions/10241045/glsl-attenuation-not-working) –

答えて

0

この画像から私は本当に何かを見ることができません。小さなオブジェクトを光源として設定するのはどうですか?

どのオブジェクトがこのシェーダを使用していますか?

私の心に来ていくつかの点:

  1. あなたが不要なステップである、あなたの頂点シェーダであなたの通常の正規化。
    頂点からフラグメントシェーダに渡されたベクトルは、補間されるので、フラグメントシェーダ内で正規化する必要があります。
    頂点シェーダでは、長さに基づく計算を行わないので、頂点シェーダでは正規化は必要ありません。

    フラグメントシェーダでノーマルを正規化してから、反射ベクトルを正規化する必要はありません。

  2. 減衰は、シェーダで計算された「複雑な」ものに基づいていません。それを出力し、残りを確認してください。あなたの散漫な言葉はどのように見えますか?

  3. またヒント:
    あなたが頂点シェーダ内部光ベクトル及び減衰計算を配置し、補間を保存するフラグメントシェーダ(4 VEC成分でそれをパック)のようにそれを渡すことができます。

  4. 最終鏡面クランプは不要ですが、値は自動的に[0,1]の範囲内にある必要があります。そうでなければ、問題があります。

+0

は、問題のユーチューブビデオです。上記の画像に表示されている青色の模様の床平面を置き換えてください:http://www.youtube.com/watch?v = Fp5HUeGaa-8 – user1337604

+0

ライトは緑の立方体のすぐ後ろに配置されています。 – user1337604

+0

1.)現在は床だけがシェーダーを使用しています。私はウェブサイトからいくつかのシェーダコードを取得しているので、無駄なステップがあることに気付きました。 2)私の減衰式が働いていると思っていました。シェイダーを嫌う方法がわからないので、私はここに来ました。シェーダで使用されているもの以外の、拡散項によって何を意味するのかわからない// Diffuse Termを計算する: vec4 Idiff = gl_FrontLightProduct [0] .diffuse * nDotL * att; Idiff =クランプ(Idiff、0.0,1.0); 3.)あなたが何を意味しているか100%は確信していませんが、後でそれを覚えておきます。 – user1337604