2014-04-26 5 views
1

나는 간단한 뷰어를 구현하려고하는데 나는 점 광원에 대해 감쇠를 구현하려고했다.가벼운 감쇠 이상한 행동

내가 가진 문제는 다음과 같다 :

나는 자연스러운 라인이 영역에 걸쳐가는 것을 가지고있다. 쉐이더에서

관련 코드는 다음과 같습니다

.... 
vec3 Ldist = uLightPosition-vPosition.xyz; 
vec3 L = normalize(Ldist); 
.... 
float NdotL = max(dot(N,L),0.0); 


float attenuation = 1.0/ (Ldist*Ldist); 

vec3 light = uAmbientColor; 

if(NdotL>0.0){ 
    specularWeighting = rho_s * computeBRDF(roughness, Didx, Gidx, Fidx, L, N, V); 
    light = light + NdotL*uLightColor*attenuation*(specularWeighting*specularColor*envColor.rgb + diffuseColor); 
} 

, 내가 정말 잘못 될 수있는 것을 볼 수 없습니다 조금 더 고급 조명하는 새로운된다.

(내가 다른 질문을해야 할지도 모르겠지만 너무 작아서 내가 여기에이 질문을 할 수 있는지 궁금해했다. 좋은 결과를 얻기 위해 빛과 강도 위치를 선택하는 법칙이 있는가? Ldistvec3* 한, 모든

vec3 Ldist = uLightPosition-vPosition.xyz; 
[...] 
float attenuation = 1.0/ (Ldist*Ldist); 

첫째,이 컴파일조차 안 : 거기 구 같은 단일 개체에)

답변

2

다음은 정말 의미는하지 않습니다 연산자는 구성 요소 현명한 곱셈을 수행하여 벡터로 나눈 스칼라를 부울로 남겨 둡니다. 그러나 구문 문제와 별개로, 단지 len(LDist)을 의미한다고 가정하면 (다음에서 d이라고 부름) 감쇠 용어는 여전히 의미가 없습니다. 일반적으로 사용되는 용어는 감쇠 a, bc 및 각각 정수, 선형 quadratric 광 감쇠 계수로 되

1.0/(a + b*d + c * d*d) 

이다. 여기서 중요한 것은 방정식의 분모가 < 1이되면 "감쇠"가 1이되어 역효과가 달성된다는 것입니다. 일반적인 장면에서 거리는 0만큼 낮을 수 있기 때문에 이런 일이 발생하지 않도록하는 유일한 방법은 일반적으로 완료되는 a> = 1을 설정하는 것입니다. 따라서 적어도 감쇠 용어로 1.0/(1.0+d)을 사용하거나 일반적으로 일정한 감쇠 계수를 추가하는 것이 좋습니다.

+0

감사합니다. 예, Ldist는 코드를 복사하여 붙여 넣기에 오타가되었습니다. 복사 조도가 1/r^2에 비례한다는 것을 알았 기 때문에 감쇠가 잘못 되었기 때문에 그렇게했습니다. 하지만 지금은 매력처럼 작동합니다. 대단히 감사합니다. – JTulip