2011-11-13 25 views
0

我一直在閱讀pdf file on OpenGL lighting是我的燈光正確嗎?

它說的洛德着色:

• Gouraud shading 
– Set vertex normals 
– Calculate colors at vertices 
– Interpolate colors across polygon 
• Must calculate vertex normals! 
• Must normalize vertex normals to unit length! 

所以這就是我所做的。 這裏是我的頂點和片段着色器文件

V_Shader:

#version 330 

layout(location = 0) in vec3 in_Position; //declare position 
layout(location = 1) in vec3 in_Color; 

// mvpmatrix is the result of multiplying the model, view, and projection matrices */ 
uniform mat4 MVP_matrix; 
vec3 ambient; 

out vec3 ex_Color; 

void main(void) { 

    // Multiply the MVP_ matrix by the vertex to obtain our final vertex position (mvp was created in *.cpp) 
    gl_Position = MVP_matrix * vec4(in_Position, 1.0); 
    ambient = vec3(0.0f,0.0f,1.0f); 
    ex_Color = ambient * normalize(in_Position) ; //anti ex_Color=in_Color; 
} 

F_shader:

#version 330 

in vec3 ex_Color; 
out vec4 gl_FragColor; 

void main(void) { 
    gl_FragColor = vec4(ex_Color,1.0); 
} 

插值是照顧由片段着色器吧?

所以這裏是我的球(它是低多邊形BTW):

enter image description here

這是實現洛德着色的標準方法是什麼? (我的球具有(0,0,0)中心) 感謝您的耐心

+0

那是一個藍色球白光,或者周圍的其他方式? – Pubby

+0

尚未指定任何淺色,如您所見。只是環境變量 –

+0

「我一直在閱讀關於OpenGL照明的PDF文件,這裏是:www.cs.cmu.edu/~fp/courses/graphics/pdf-color/08-shading.pdf」該PDF文件解釋瞭如何固定功能GL工作。並沒有詳細解釋功能背後發生了什麼。爲什麼你會用這個而不是任何數量的基於着色器的照明教程來學習? –

回答

3
ex_Color = ambient * normalize(in_Position) ; //anti ex_Color=in_Color; 

允許我quote myself,「這當然沒有資格作爲‘照明’。」在你問這個問題的第一次和現在之間,這並沒有停止。

這不是照明。這只是標準化模型空間位置並將其乘以環境顏色。即使我們假設模型空間位置以0爲中心並表示球體上的一個點,將光線與法線相乘也沒有意義。這是不是照明。

如果你想學習如何照明工程,read this.Or this.

+0

我想問的另一件事是,在我的情況下,normalize(in_Position )等於頂點正常的權利?因爲我的中心是(0,0,0)? –

+0

@TrtTrt:在嘗試可愛的優化之前,我會建議你做一些事情,比如假設模型空間位置是以零爲中心的球體。所以只需傳遞一個實際的正常值,這樣就不會混淆查看代碼的人。 –

+0

我不假設。它是(0,0,0) –