2012-05-07 63 views
0

我使用窗口來照相機中實現的每個片段的照明和光衰減變換:每片段照明和窗口照相機變換

vec4 ndcPos; 
ndcPos.xy = ((gl_FragCoord.xy/windowSize.xy) * 2.0) - 1.0; 
ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far)/(gl_DepthRange.far - gl_DepthRange.near); 
ndcPos.w = 1.0; 

vec4 clipPos = ndcPos/gl_FragCoord.w; 

vec3 cameraPos = vec3(clipToCameraMatrix * clipPos); 

然後我使用lightPos和cameraPos來計算照明。 lightPos在世界空間中擁有固定的位置。我有ViewMatrix來處理fps風格的相機和ModelMatrix。早些時候,我使用頂點位置而不是窗口進行相機轉換,一切正常。現在,當我使用相機移動物體時,我得到的照明不正確。在上傳到片段着色器之前,LightPos將乘以ViewMatrix。

glUniform3fv(dirToLightUniformLocation, 1, glm::value_ptr(ViewMatrix * lightPos)); 

我不知道我在做什麼錯。

+0

你的代碼看起來是正確的,所以這個錯誤是在你沒有發佈的代碼中。 –

回答

0

照明有什麼問題?在移動視圖時,照明是否保持靜態? (即鏡面高光永不移動)。

您lightPos應該是標準化的VEC3:lightPosition - (worldMatrix * vertexPosition)

+0

我還沒有實現鏡面高光,但你可以看到下面的圖片什麼是錯的。照明向觀察者扭曲。 lightPosition - (worldMatrix * vertexPosition)給出了完全錯誤的照明。我的代碼是基於[鏈接](http://www.arcsynthesis.org/gltut/Illumination/Tut10%20Distant%20Points%20of%20Light.html)不良照明:[鏈接](http://img213.imageshack。我們/ img213/3498/badlighting.jpg)良好的照明(頂點位置而不是窗口到相機的變換):[鏈接](http://img705.imageshack.us/img705/3685/goodlighting.jpg) – Irbis

+0

_Good lighting_有衰減的因素呢? –

+0

是的,但正如我在良好的照明中提到的,我使用頂點位置乘以模型矩陣。例如,在光衰減方程中使用的距離=長度(lightPos-vec3(position)); – Irbis

1

你有一個問題就在這裏:

ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far)/(gl_DepthRange.far - gl_DepthRange.near); 

,除非您使用的是正投影gl_FragCoord .z不會將線性映射到深度範圍,這是由w分割造成的。雖然有可能(並且不難)對其進行反投影,但我建議您只需使用額外的變化輸入/輸出將頂點着色器中的視角空間眼圖位置傳遞給片段着色器。

+0

當我使用lightPos和頂點位置乘以模型矩陣時,一切正常(良好的照明),但我想嘗試使用lightPos和窗口到相機變換來計算光照。我基於[link]實現了這種技術(http://www.arcsynthesis.org/gltut/Illumination/Tut10%20Distant%20Points%20of%20Light.html)該教程有問題嗎?我的代碼和教程代碼之間的主要區別在於相機的工作方式。 – Irbis