Knitex
Knitex

Reputation: 225

Lighting in OpenGL

I'm trying to get this room to have a lightbulb effect but im not sure whats wrong with it. as of right now the light just seems to be shining on the top of the sphere and the side of the cone and the walls are not getting any of the light. i tried fiddling around with the position and direction but nothing is working.

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

Upvotes: 1

Views: 409

Answers (1)

datenwolf
datenwolf

Reputation: 162164

1st: You must supply normals.

2nd: The OpenGL fixed function pipeline evaluated illumination only at the vertices and then does barycentric color interpolation. Corners of a box with a light source somewhere inside receive the least light. With a box consisting of only 6 quads you will not get a nice falloff, but only dimly lit walls. You either have to use a fragment shader to implement per fragment lighting (recommended) or tesselate your quads down into a reasonable number of smaller quads forming the wall, so that there are enough interpolation sampling points, where illumination is evaluated.

Upvotes: 3

Related Questions