2011-08-28 49 views
4

我知道網絡上有幾個線程關於同樣的問題,但我沒有得到這些幫助,因爲我的實現是不同的。延期渲染和移動點光線

我將視圖空間中的顏色,法線和深度渲染爲紋理。在第二部分中,我將紋理與全屏四邊形進行綁定並計算照明。定向燈似乎工作正常,但點燈正在與相機一起移動。

我共享相應的着色器代碼:

照明步驟頂點着色器

in vec2 inVertex; 
in vec2 inTexCoord; 
out vec2 texCoord; 
void main() { 
    gl_Position = vec4(inVertex, 0, 1.0); 
    texCoord = inTexCoord; 
} 

照明步驟片段着色器

float depth = texture2D(depthBuffer, texCoord).r; 
vec3 normal = texture2D(normalBuffer, texCoord).rgb; 
vec3 color = texture2D(colorBuffer, texCoord).rgb; 

vec3 position; 
position.z = -nearPlane/(farPlane - (depth * (farPlane - nearPlane))) * farPlane; 
position.x = ((gl_FragCoord.x/width) * 2.0) - 1.0; 
position.y = (((gl_FragCoord.y/height) * 2.0) - 1.0) * (height/width); 
position.x *= -position.z; 
position.y *= -position.z; 

normal = normalize(normal); 
vec3 lightVector = lightPosition.xyz - position; 
float dist = length(lightVector); 
lightVector = normalize(lightVector); 

float nDotL = max(dot(normal, lightVector), 0.0); 
vec3 halfVector = normalize(lightVector - position); 
float nDotHV = max(dot(normal, halfVector), 0.0); 

vec3 lightColor = lightAmbient; 
vec3 diffuse = lightDiffuse * nDotL; 
vec3 specular = lightSpecular * pow(nDotHV, 1.0) * nDotL; 
lightColor += diffuse + specular; 
float attenuation = clamp(1.0/(lightAttenuation.x + lightAttenuation.y * dist + lightAttenuation.z * dist * dist), 0.0, 1.0); 

gl_FragColor = vec4(vec3(color * lightColor * attenuation), 1.0); 

我送光attribues着色器制服:

shader->set("lightPosition", (viewMatrix * modelMatrix).inverse().transpose() * vec4(0, 10, 0, 1.0)); 

viewmatrix是相機矩陣,modelmatrix就是這裏的標識。

爲什麼指點燈是用相機而不是模型來轉換的?

歡迎任何建議!

+3

對於'vec3 halfVector = normalize(lightVector - position);'工作向量'position'必須有單位長度(或者至少與'lightVector'相同)否則你不會得到半邊界,由矢量長度加權。 – Nobody

回答

3

除了Nobody的評論,你計算的所有向量必須被歸一化,你必須確保它們都在同一個空間。如果將視圖空間位置用作視圖矢量,則法向矢量也必須位於視圖空間中(必須在第一遍寫入G緩衝區之前通過逆轉置模型視圖矩陣進行轉換)。光矢量也必須處於視野空間中。因此,必須通過視圖矩陣(或模型視圖矩陣,如果光照位置不在世界空間中)而不是其反向轉置來轉換光照位置。

shader->set("lightPosition", viewMatrix * modelMatrix * vec4(0, 10, 0, 1.0)); 

編輯:對於定向光反置實際上是一個好主意,如果你指定光源的方向爲方向,以光(如在-z方向的光指向vec4(0, 1, 0, 0))。