2012-11-20 61 views
1

我想讓這個房間有一個燈泡效果,但我不知道它有什麼問題。截至目前,光線似乎正在照亮球體的頂部,錐體的側面和牆壁沒有得到任何光線。我試圖擺弄位置和方向,但沒有任何工作。OpenGL中的照明

#include <GLUT/glut.h> 
#include <stdio.h> 
#include <stdlib.h> 
//Global variables 
double sphere = 1, cone = 1, viewy = 2, viewx = -10, viewz = 5,headup = 5,headright = 5; 
void myinit(){ 
    glClearColor(0,0,0,1); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,1,1,100); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_COLOR_MATERIAL); 
    //glOrtho(-2,20,-2,20,-10,10); 
} 
void drawRoom(){ 
    //floor 
    glBegin(GL_POLYGON); 
    glColor3f(1,1,1); 
    glVertex3f(0,0,0); 
    glVertex3f(0,10,0); 
    glVertex3f(10,10,0); 
    glVertex3f(10,0,0); 
    glEnd(
    ); 
    //wall 
    glBegin(GL_POLYGON); 
    glColor3f(0,0,1); 
    glVertex3f(0,10,0); 
    glVertex3f(0,10,10); 
    glVertex3f(10,10,10); 
    glVertex3f(10,10,0); 
    glEnd(); 
    //wall2 
    glBegin(GL_POLYGON); 
    glColor3f(0,1,0); 
    glVertex3f(10,10,0); 
    glVertex3f(10,10,10); 
    glVertex3f(10,0,10); 
    glVertex3f(10,0,0); 
    glEnd(); 
} 
void drawObjects(){ 
    //draw cone 
    glShadeModel(GL_FLAT); 
    glColor3f(1,0,1); 
    glTranslatef(2,2,0); 
    glutSolidCone(cone,5,10,2); 
    //draw sphere 
    glShadeModel(GL_SMOOTH); 
    glTranslatef(5,5,0); 
    glColor3f(1,0,0); 
    glutSolidSphere(sphere,500,500); 

} 
void move(unsigned char key, int x, int y){ 
    switch(key){ 
     case 'y': 
      viewy++; 
      glutPostRedisplay(); 
      break; 
     case 'x': 
      viewx++; 
      glutPostRedisplay(); 
      break; 
     case 'z': 
      viewz++; 
      glutPostRedisplay(); 
      break; 
     case 'Z': 
      viewz--; 
      glutPostRedisplay(); 
      glutPostRedisplay(); 
      break; 
     //moves head 
     case 'd': 
      headup--; 
      headright--; 
      glutPostRedisplay(); 
      break; 
     case 'a': 
      headup++; 
      headright++; 
      glutPostRedisplay(); 
      break; 
    } 
} 

void display(){ 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(viewx,viewy,viewz,headup,headright,5,0,0,1); 
    glClear(GL_COLOR_BUFFER_BIT); 
    drawRoom(); 
    GLfloat light_position[] = {5.0,5.0,10.0,0.0}; 
    GLfloat light_direction[] = {-5,-5,-5}; 
    GLfloat amb[] = {0,0,0,1}; 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position); 
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,light_direction); 
    glLightfv(GL_LIGHT0, GL_AMBIENT,amb); 
    drawObjects(); 
    glutSwapBuffers(); 
    glFlush(); 
} 
int main (int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(100,100); 
    glutCreateWindow("Room"); 
    myinit(); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(move); 
    //glutMotionFunc(moveHead); 
    glutMainLoop(); 
    return 0; 
} 
+0

對於牆壁,您需要添加法線,以便它可以正常點亮,否則它會顯得平坦。錐體和其他'glut'物體應該爲你產生它們的法線。 – sean

回答

3

1st:您必須提供法線。

第二:OpenGL固定功能流水線僅在頂點評估照度,然後進行重心顏色插值。一個帶有光源的箱子的角落接收最少的光線。只有6個四邊形組成的箱子,你不會得到一個不錯的衰減,但只有昏暗的牆壁。您必須使用片段着色器來實現每個碎片照明(推薦)或將您的四邊形拼湊成合理數量的小四邊形成牆,以便有足夠的插值採樣點(評估照明)。