我嘗試使用GLSL在OpenGL中實現點光源。我將所有需要的數據發送給着色器。爲了簡單起見,我只在這裏使用漫射光。OpenGL GLSL插值
我的例子顯示了一個巨大的三角形,我想用一個光源照亮。光源顯示爲一個小藍色三角形。
對於漫射光,我需要知道光線與表面之間的角度。因此,我計算法線和光線的方向。點積將給我一個介於-1和1之間的數字,而0和1之間的所有數值都會被照亮。
但是,在這裏我卡住了,因爲這個角度在我的例子中計算不正確。由於很難調試着色器,因此我使用了多個輸出作爲我的曲面的顏色。我用法線作爲三角形的顏色,無論光線在哪裏,表面總是綠色的。也就是說,法線指向y軸,因此它們的計算是正確的。也就是說,光的方向一定是錯的。但是,我找不到它錯的原因。光的位置和頂點」位置被傳遞在世界空間的頂點着色器,然後將其變換到眼的空間,計算光的方向,並通過這對片段着色器:
頂點着色器:
vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;
vec3 lightDir = normalize(lightPos.xyz - pos.xyz);
片段着色器:
float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);
我追加這個例子中的一些照片,這無疑表明,該插值是很奇怪的。我知道想知道我粘貼的代碼是否正確,或者您是否需要了解更多代碼。此外,這是插值行爲正常還是在我的代碼中的錯誤?
http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png
尤其是第一圖片顯示的光的中心光點是NOT直屬光但是稍微移動到三角形的中心。
如果我將「pos」傳遞給片段着色器(即插值),然後在片段着色器中計算「lightDir」,則一切正常。
不要標準化頂點着色器中的lightDir。由於規範化不是線性操作,因此您只應在碎片着色器中執行此操作。 – Hannesh 2010-12-11 09:49:54