2011-06-02 57 views
3

我已经写了下面的程序,在两面墙壁和一个地板的房间的桌子上显示一个茶壶。Opengl适当的照明问题

#include <stdio.h> 
#include <glut.h> 


void wall1(float thickness) 
{ 
    glPushMatrix(); 
    glTranslatef(100,100,0); 
    glRotatef(90,1,0,0); 
    glScalef(thickness,1,1); 
    glutSolidCube(100); 
    glPopMatrix(); 
} 
void wall2(float thickness) 
{ 
    glPushMatrix(); 
    glTranslatef(150,100,-50); 
    glScalef(1,1,thickness); 
    glutSolidCube(100); 
    glPopMatrix(); 
} 
void floor(float thickness) 
{ 
    glPushMatrix(); 
    glTranslatef(150,50,0); 
    glScalef(1,thickness,1); 
    glutSolidCube(100); 
    glPopMatrix(); 
} 
void leg(float thickness) 
{ 
    glPushMatrix(); 
    glScalef(thickness,.5,thickness); 
    glutSolidCube(100); 
    glPopMatrix(); 
} 
void tableTop(float thickess) 
{ 
    glPushMatrix(); 
    glTranslatef(150,100,0); 
    glScalef(.5,thickess,.5); 
    glutSolidCube(100); 
    glPopMatrix(); 
} 
void table() 
{ 
    tableTop(.05); 

    glPushMatrix(); 
    glTranslatef(125,75,-25); 
    leg(.05); 
    glPopMatrix(); 

    glPushMatrix(); 
    glTranslatef(175,75,-25); 
    leg(.05); 
    glPopMatrix(); 

    glPushMatrix(); 
    glTranslatef(175,75,25); 
    leg(.05); 
    glPopMatrix(); 

    glPushMatrix(); 
    glTranslatef(125,75,25); 
    leg(.05); 
    glPopMatrix(); 

    glPushMatrix(); 
    glTranslatef(150,110,0); 
    glScalef(.1,.1,.1); 
    glutSolidTeapot(100); 
    glPopMatrix(); 
} 
void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    float pos[] = {200,200,0}; 
    float dif[] = {.3,.3,.3,3}; 
    float spe[] = {1,1,1,1}; 
    float amb[] = {1,1,1,0}; 
    glLightfv(GL_LIGHT0,GL_POSITION,pos); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,dif); 
    glLightfv(GL_LIGHT0,GL_AMBIENT,amb); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,spe); 

    glTranslatef(50,50,0); 
    glRotatef(30,1,0,0); 
    glRotatef(-30,0,1,0); 
    wall1(.05); 
    wall2(.05); 
    floor(0.05); 
    table(); 

    glFlush(); 
} 
void reshape(int w,int h) 
{ 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0,400,0,400,-400,400); 
    glMatrixMode(GL_MODELVIEW); 
} 

void main(int argc,char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(400,400); 
    glutCreateWindow("woot"); 
    glClearColor(1,1,1,1); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 


    glShadeModel(GL_SMOOTH); 
    glutReshapeFunc(reshape); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
} 

这个问题是我的照明部分没有按预期工作。它不是照亮均匀我的所有物品...我错过了什么?这甚至使茶壶难以入海。 我的照明部分在显示功能。

回答

4

我缺少

glEnable(GL_NORMALIZE);

在主函数中,因此opengl没有正确渲染它! Alse @ Christian使用环境的答案只能奏效。

:)

+0

但是你知道,环境不是光明,而是颜色不足? – 2011-06-02 12:58:37

+2

啊,我看到现在发生了什么:缩放也影响法线。另外尝试glEnable(GL_RESCALE_NORMAL);如果可用,它比标准化要快一点。 – datenwolf 2011-06-02 13:24:30

+0

@christian哦!我不知道..虽然它是一个光源......它将被添加到原材料的颜色right – footy 2011-06-02 14:36:17

0

如果要均匀照亮所有对象,请仅使用环境照明。

3

OpenGL固定功能流水线照明仅在顶点进行评估。 glutSolidCube只是在角落和其他地方创建顶点。所以你的照明只计算得非常粗糙。您可以通过使用着色器切换到每个碎片照明,或者镶嵌您的对象。后者要求您不要使用glutSolidCube,而是加载在3D建模器中建模的对象,或编写自己的原始生成器以提供更高的细分。我强烈建议第一个选项。

glutSolidCube只是在函数BTW中的一个非常粗糙的立场。

+0

ok :)这只是用于练习照明功能,我正在编写的程序。我将在下一次写入程序时记住这一点 – footy 2011-06-02 12:55:46