OpenGL правильная проблема освещения - PullRequest
3 голосов
/ 02 июня 2011

Я написал следующую программу для отображения чайника на столе в комнате с 2-сторонними стенами и полом.

#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();
}

Проблема в том, что моя осветительная часть не работает должным образом.Он не освещает равномерно все мои объекты ... Чего мне не хватает?Это делает даже чайник трудным в море.Моя часть освещения находится в функции отображения.

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

Мне не хватало

glEnable (GL_NORMALIZE);

в основной функции, и, таким образом, opengl не отображал ее должным образом!Ответ Alse @ Christian об использовании только ambient сработал.

:)

3 голосов
/ 02 июня 2011

Освещение конвейера с фиксированной функцией OpenGL оценивается только в вершинах.glutSolidCube просто создает вершины по углам и больше нигде.Так что ваше освещение рассчитано только очень грубое.Вы можете переключиться на освещение по фрагментам с помощью шейдера или тесселяции ваших объектов.Последнее требует, чтобы вы не использовали glutSolidCube и вместо этого загружали объекты, смоделированные в 3D-моделирующем устройстве, или не писали свои собственные примитивные генераторы, которые предлагают более высокое тесселяцию.Я настоятельно рекомендую первый вариант.

glutSolidCube это просто очень грубый стенд в функции BTW.

0 голосов
/ 02 июня 2011

Если вы хотите равномерно освещать все объекты, используйте только естественное освещение.

...