디지털 그래픽스

[openGL] Light & Material

gom1n 2021. 6. 1. 13:17

코드)

#include <iostream>
#include <math.h>
#include <gl/glut.h>
using namespace std;

int w = 500, h = 500;
GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat light_diffuse[] = { 1.0, 0.5, 0.5, 1.0 };
GLfloat light_specular[] = { 0, 1, 0, 0 };

GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };

GLfloat mat0[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
GLfloat mat_diffuse[] = { 1, 0.2, 0.2, 1.0 };

GLfloat no_shininess[] = { 0.0 };
GLfloat low_shininess[] = { 5.0 };
GLfloat high_shininess[] = { 20.0 };

GLfloat mat_emission[] = { 0.3, 0.3, 0.0, 1.0 };

void init(void)
{
    glEnable(GL_DEPTH_TEST);

    //Light Reflectace Model
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, position);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glClearColor(0, 0, 0, 0);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-6.0, 6.0, -6.0, 6.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);

   
    glPushMatrix(); {
        glTranslatef(-3.75, 3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat0);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    }glPopMatrix();

    glPushMatrix(); {
        glTranslatef(-1.25, 3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat0);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(1.25, 3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat0);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    }glPopMatrix();

    glPushMatrix(); {
        glTranslatef(3.75, 3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat0);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
        glutSolidSphere(1.0, 30, 30);
    }glPopMatrix();

    glPushMatrix(); {
        glTranslatef(-3.75, 0.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(-1.25, 0.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(1.25, 0.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(3.75, 0.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
        glutSolidSphere(1.0, 30, 30);
    }glPopMatrix();
     
    glPushMatrix(); {
        glTranslatef(-3.75, -3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    }glPopMatrix();

    glPushMatrix(); {
        glTranslatef(-1.25, -3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(1.25, -3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, light_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat0);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glPushMatrix(); {
        glTranslatef(3.75, -3.0, 0.0);
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat0);
        glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
        glutSolidSphere(1.0, 30, 30);
    } glPopMatrix();

    glFlush();
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(w, h);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("shading");
    init();

    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

 

 

결과)