2012-04-20 11 views
1

問題:距離が増すにつれて光の強度を減少させることで、減衰が機能しない。GLSL - 減衰が機能しない

私の拡散反射、鏡面反射、周囲反射は機能しているようです。私は減衰変数の式を追加してから、各拡散、鏡面、および周囲環境に一度減衰を掛けました。ここ

は、光がわずかキューブの背後に配置され、床照明の写真である:

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; 
} 
.vert

img http://oi42.tinypic.com/28luzci.jpg

+0

を助けるそれをチェックアウト。 'gl_LightSource [0] .linearAttenuation'と' gl_LightSource [0] .quadaticAttenuation'が満たされていなければ、それらの式は無意味です。 –

+0

最初の光のクワッド減衰を "glLightf(GL_LIGHT0、GL_QUADRATIC_ATTENUATION、0.0004f);" – user1337604

+0

あなたのシーンのスケールは何ですか?オブジェクトはどれくらい離れていますか? –

答えて

関連する問題