2009-06-14 73 views
0

我嘗試使用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」,則一切正常。

+0

不要標準化頂點着色器中的lightDir。由於規範化不是線性操作,因此您只應在碎片着色器中執行此操作。 – Hannesh 2010-12-11 09:49:54

回答

3

我認爲在頂點着色器中標準化lightDir會影響插值矢量時得到的結果,因爲它將長度從等式中移出,從而影響插值的「速度」。

如果您想要(視覺)解釋,請嘗試在紙上以2D繪製它。首先畫一條線(你的三角形)和一個點(光源)。將線兩端的兩條線(lightDir)添加到光源,然後收縮(標準化)這些lightDir線,使它們具有相同的長度並且在光源處相遇。如果連接標準化的lightDir線的兩端,您將得到一條非平行線(如果光源不在您的第一條線的中間)。 現在,如果您繪製的線完全穿過其中一條線的中間,您將看到它不會穿過另一條線的中間,但會向左或向右點擊。