簡體   English   中英

照明不適用於OpenGL-純色

[英]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)。

還要仔細檢查您提供給glVertexglNormal的數據是否正確。 在0,0,0處渲染球體時,每個頂點的法線就是該頂點的歸一化位置(顯然,僅適用於球體)。


附帶說明一下,這段代碼顯然已經過時了,作為免責聲明,如果您只是學習而切換到相對較新的並且使用可編程管道的內容,那么我將全部放棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM