2016-06-03 9 views
1

최근에 내 엔진 (지연된 음영)에 SSAO를 구현했지만 SSAO와 글로벌 라이트 및 로컬 라이트 (포인트 라이트)를 결합해야하는 방법에 대해 매우 불안합니다.SSAO와 전역 조명 및 로컬 표시 등을 결합하십시오.

나는이 작업을 수행해야 :

//Global light pass. 
vec3 sceneColor = DiffuseBRDF + SpecularBRDF; 
float luminance = dot(sceneColor, vec3(0.2126, 0.7152, 0.0722)); 
sceneColor *= mix(texture(ssaoTexture, texCoord).r, 1.0, luminance); 

//Local light pass. 
//Use additive blending in this pass, i.e. glBlendFunc(GL_ONE, GL_ONE). 
//The final result would be: 
vec3 finalColor = sceneColor + pointLight0 + pointLight1 + ... + pointLightN; 

나이 :

//Global light pass. 
vec3 sceneColor = DiffuseBRDF + SpecularBRDF; 

//Local light pass. 
//Use additive blending in this pass, i.e. glBlendFunc(GL_ONE, GL_ONE). 
vec3 finalColor = sceneColor + pointLight0 + pointLight1 + ... + pointLightN; 

//Composite pass. 
float luminance = dot(finalColor, vec3(0.2126, 0.7152, 0.0722)); 
finalColor *= mix(texture(ssaoTexture, texCoord).r, 1.0, luminance); 
+0

음,'ssaoTexture'는 무엇을 의미합니까? SSAO는 장면의 모서리를 찾아이를 기반으로 주변의 빛을 없애고 화면 공간에서 일어난 것 같습니다. 나는 그 모델에 맞는'ssaoTexture'에 무엇이 있을지 모른다. –

+0

ssaoTexture에는 현재 프레임에 대해 계산 된 SSAO가 포함됩니다. – karl88

답변

3

주변 폐색이 많은 주위의 빛이 표면에 점을 칠 수를 나타내는 값이다. 주변 광선은 단일 광원이 아닌 모든 방향에서 오는 빛이며 일반적으로 하늘 조명, 이미지 기반 조명, 전역 조명 또는 단순한 평면 색상을 포함합니다. AO를 적용하는 올바른 방법은 그것을 주변 조명과 곱하는 것입니다. 간단히 말해서 앰비언트 오 클루 전 (ambient occlusion)은 그림자가 조명을 지시하기 때문에 앰비언트 조명입니다.

따라서 포인트 라이트가 "대기 중"라이트이고 반사 하이라이트가없는 부드러운 앰비언트 라이팅을 나타내려면 휘도 스케일링없이 AO를이 포인트 라이트에만 적용해야합니다. 점 광원이 광원이 잘 정의 된 광원이고 중요한 주변 조명이없는 경우 일관된 광원 밝기로 모든 조명에 AO를 적용하고 올바른 AO 적용으로 생성 된 모양을 시뮬레이션해야합니다.

+0

감사합니다! 이제 어떻게이 효과를 적용 할 수 있는지 :) – karl88