[英]Lighting not working on OpenGL - Solid color
照明不起作用,對象以純色顯示。 顏色本身隨材質或照明參數而變化,但沒有陰影或僅是純灰色的任何東西。
這是代碼的一部分:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glFrontFace(GL_CCW);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);
GLfloat amb[] = {0.6, 0.6, 0.6, 1.0};
GLfloat dif[] = {0.8, 0.8, 0.8, 1.0};
GLfloat spec[] = {0.5, 0.5, 0.5, 1.0};
GLfloat pos[] = {0.0, 0.0, 30.0};
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
GLfloat co[4]={0.5, 0.5, 0.5, 0.5};
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, co);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
for(int i=0; i < numofTr; i++)
{
glBegin(GL_TRIANGLES);
glNormal3f(tr[i].v1->n.x, tr[i].v1->n.y, tr[i].v1->n.z);
glVertex3f(tr[i].v1->x, tr[i].v1->y, tr[i].v1->z);
glNormal3f(tr[i].v2->n.x, tr[i].v2->n.y, tr[i].v2->n.z);
glVertex3f(tr[i].v2->x, tr[i].v2->y, tr[i].v2->z);
glNormal3f(tr[i].v3->n.x, tr[i].v3->n.y, tr[i].v3->n.z);
glVertex3f(tr[i].v3->x, tr[i].v3->y, tr[i].v3->z);
glEnd();
}
我不知道自己缺少什么,與對象一起顯示時法線看起來不錯。
您正在灰色物體上使用暗光。 顯然結果是灰色的。
如果您是說臉部是平面陰影,那是因為glShadeModel(GL_FLAT);
。 將其更改為GL_SMOOTH
以啟用插值。
如果對象是3D,我認為您只需要傳遞3個浮點就可以了,因為位置可能很重要; 默認值為[0,0,1,0]
,並且該函數期望有四個浮點數(第4個為W坐標,在大多數情況下應等於1,對於無限距離的燈光應等於0)。
還要仔細檢查您提供給glVertex
和glNormal
的數據是否正確。 在0,0,0處渲染球體時,每個頂點的法線就是該頂點的歸一化位置(顯然,僅適用於球體)。
附帶說明一下,這段代碼顯然已經過時了,作為免責聲明,如果您只是學習而切換到相對較新的並且使用可編程管道的內容,那么我將全部放棄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.