2011-05-26 48 views
-1

我剛開始寫的Phong着色器GLSL海防光燈,拍照問題

vert: 
varying vec3 normal, eyeVec; 
#define MAX_LIGHTS 8 
#define NUM_LIGHTS 3 
varying vec3 lightDir[MAX_LIGHTS]; 

void main() { 
    gl_Position = ftransform(); 
    normal = gl_NormalMatrix * gl_Normal; 
    vec4 vVertex = gl_ModelViewMatrix * gl_Vertex; 
    eyeVec = -vVertex.xyz; 
    int i; 

    for (i=0; i<NUM_LIGHTS; ++i){ 
     lightDir[i] = vec3(gl_LightSource[i].position.xyz - vVertex.xyz); 
    } 
} 

我知道,我需要讓相機位置uniform,而是如何,在哪裏把這個價值?

ps。我使用的是opengl 2.0

回答

4

您不需要傳遞相機位置,因爲在OpenGL中沒有相機。

照明計算在眼睛/世界空間中執行,即在與模型視圖矩陣相乘之後執行,其也執行「照相機定位」。所以實際上你已經有了正確的東西。使用ftransform()是有點低效率的,因爲你做的是什麼再做一半(gl_ModelviewMatrix * gl_Vertex,你可以做成ftransform這種通過增加gl_Position = gl_ProjectionMatrix * eyeVec

所以,如果你的車燈似乎動的時候你的「照相機」的變換,你沒有適當地改變燈光的位置。既可以預先計算轉換後的燈光位置,也可以在着色器中轉換它們。這更多的是選擇約定的問題,如果使用着色器則更少佈局約束。

+0

「OpenGL中沒有攝像頭」哈哈*心靈打擊*。但也有人說,相機總是在原點...... – Calvin1602 2011-05-27 23:35:34

+0

@ Calvin1602:不,在OpenGL中沒有相機;或任何其他光柵化器說。這與實際模擬真實相機行爲的一些基於物理學的渲染器不同。你在OpenGL中有幾何變換。這可能聽起來像挑剔,但他們說,魔鬼在細節。 – datenwolf 2011-05-28 05:43:51

+0

我知道 - 我只是想說當你第一次聽到這些時它很奇怪。非常直觀。 – Calvin1602 2011-05-28 09:04:17