2010-10-26 226 views
4

我正在教一個OpenGL基礎知識的項目。我在相機旋轉,翻譯等方面的大部分要求工作得很好。但是,我在照明方面苦苦掙扎。OpenGL燈光奮鬥

此圖片是我目前的程序(左)與樣本解決方案(右)的比較。 current program compared to sample solution

如果你不能說,我在卡車上得到非常單色的顏色。陰影非常尖銳和黑暗,高點是單色而不是鏡面反射。 該項目需要使用紋理;我在這裏展示的是純灰色像素的基本紋理,但我可以使用任何紋理(包括用於地面的沙灘沙)。 我從網格繪製對象:

GLfloat ambient[] = {0.1, 0.1, 0.1, 1}; 
GLfloat diffuse[] = {0.1, 0.1, 0.1, 1}; 
GLfloat specular[] = {1.0, 1.0, 1.0, 1.0}; 
GLfloat shine = 100.0; 

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); 
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); 
glMaterialfv(GL_FRONT, GL_SPECULAR, specular); 
glMaterialf(GL_FRONT, GL_SHININESS, shine); 

glEable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureNumber); 
glBegin(GL_TRIANGLES); 

for (int i = 0; i < meshes[n]->nTriangles; i++) { 
    for (int j = 0; j < 3; j++) { 
     glNormal3fv(mesh -> normals[mesh->triangles[i][j]]); 
     glTexCoord2fv(mesh->texCoords[mesh->triangles[i][j]]); 
     glVertex3fv(mesh -> vertices[mesh->triangles[i][j]]); 
    } 
} 
glEnd(); 

有場景中的一個光:

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 
glEnable(GL_DEPTH_TEST) 


GLfloat diffuse0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat ambient0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat specular0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat light0_pos[]={1.0, 1.0, 1,0, 1.0}; 

glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0); 
glLightfv(GL_LIGHT0, GL_SPECULAR, specular0); 

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0); 
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0); 
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 2.0); 

有什麼重大的我失蹤,可能是造成這種嚴重的區別?我應該玩的特殊價值?或者我錯過了一個glEnable電話? 任何幫助,建議或指向其他地方非常讚賞。

回答

2

爲了消除銳減 - 關閉,放大環境光線。在OpenGL中沒有全局照明模型,因此參數除了沒有其他光線落在面上的顏色之外絕對沒有效果。

由於您正在使用glVertex類型的調用,我會走出一條腿並猜測您正在使用固定功能管道?如果是這樣,則在頂點計算光照,然後在多邊形表面上進行插值。這意味着鏡面高光在「大」多邊形上不能很好地工作 - 粗略地說,高光不能出現在多邊形的中間。帶有可編程流水線(包括現今手機中的流水線)的GPU可以計算每個像素點的光照,而不是每個頂點的光照,但OpenGL不會爲你做這件事,所以你需要自己研究着色器編程。或者確保您的模型由足夠小的多邊形組成。

你的閃亮指數也相當高 - 你有沒有試過撥幾下?

1

望着後臺的時候,它看起來就像剛沐浴場景熱烈光權的焦點,並在極端閃電左曬着一切Flakscheinwerfer,消除陰影籠罩

+0

...這是幫助如何? – DarkDust 2010-10-26 07:44:25

+1

也許他可以嘗試漫反射(不太亮)1.0的環境和鏡面值?他的光芒是一個巨大的白色星星,如果他把價值觀調整到更黃的聚光燈下,他會得到更好的結果。 – 2010-10-26 08:31:25