opengl 笔记(2)

/*-
 * Opengl Demo Test
 *
 * Fredric  : 2016-7-10
 */

#include <GLUT/GLUT.h>
#include <stdlib.h>

void display_demo01();
void display_demo1_idle();

int main(int argc, const char * argv[]) {

    
    glutInit(&argc, argv);
    
    glutCreateWindow("Fredric Practice Demo");
    
    glutDisplayFunc(display_demo01);
    
    /*
     * void APIENTRY glutIdleFunc(void (*func)(void))
     * 当没有窗口事件发生时的全局回调函数
     */
    glutIdleFunc(&display_demo1_idle);
    
    glutMainLoop();
    
}

//****************************************************************************

static int g_angle = 0;

/*
 *  基础动画及光照效果
 *  3D图形中的四种光源模型:
 *  1、点光源:光源从某一点向四面八方传播,例如太阳
 *  2、无穷远光源:对于被照射的物体而言,光线平行摄入,如无穷远处的阳光;
 *  3、方向光源:沿某个方向在特定角度内摄入,如手电筒、车灯等;
 *  4、环境光源:从各个角度都有投射到场景中的光线
 *  PS:在opengl中还考虑自身发光的光源
 *
 *  光线是会随着距离的增加而衰减的,衰减的程度成为衰减因子k,方向光源在偏离该方向时也会衰减
 
 *  同时材质需要在光照中考虑反射的情况,分为:
 *  1、慢反射:光线射到物体后,其反射是任意方向的;
 *  2、镜面反射:光线射到物体后,其反射是根据被照射物体的法线方向;
 *
 *  综上,对opengl中的某个3D图像顶点的绘制基于如下公式:
 *  顶点颜色 = 材质自发光颜色项 + ∑(环境光颜色+衰减因子×(漫反射项 + 镜面反射项))
 */
void display_demo01(){
    
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
    glShadeModel(GL_SMOOTH);
        
    glMatrixMode(GL_PROJECTION);
        
    glLoadIdentity();
        
    gluPerspective(75, 1, 1, 1000);
        
    glMatrixMode(GL_MODELVIEW);
        
    glLoadIdentity();
        
    gluLookAt(0, -100, 200, 0, 50, 10, 0, 0, 1);
    
    glColor3f(0.0f, 0.4f, 0.2f);
    
    glRotatef(-(g_angle * 10.0f),10.0f,5.0f,0.0f);
    
    //设置光源
    {
        GLfloat light_position[] = {200.0f, 300.0f, 400.0f, 1.0f};
        GLfloat light_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
        GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
        GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
        
        /*
         *  glLightfv (GLenum light, GLenum pname, const GLfloat *params);
         *  控制光源的位置、强度、颜色等
         *  light:GL_LIGHT0 表示第一个光源 GL_LIGHT1 表示第二个光源
         *  panme: 光源控制的类型
         *      GL_POSITION:光源位置
         *      GL_AMBIENT: 光源中的环境光强度
         *      GL_DIFFUSE: 光源中的散射光强度
         *      GL_SPECULAR: 光源中的镜面反射光强度
         */
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
        glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
        
        glEnable(GL_LIGHT0);
        glEnable(GL_LIGHTING);
        glEnable(GL_DEPTH_TEST);
    }
    
    //设置材质
    {
        GLfloat mat_ambient[] = {0.0f, 0.5f, 0.3f, 1.0f};
        GLfloat mat_diffuse[] = {0.0f, 0.3f, 0.2f, 1.0f};
        GLfloat mat_specular[] = {0.0f, 0.8f, 0.2f, 1.0f};
        GLfloat mat_emission[] = {0.5f, 0.0f, 0.0f, 1.0f};
        GLfloat mat_shininess = 68.0f;
        
        /*
         *  glMaterialfv (GLenum face, GLenum pname, const GLfloat *params)
         *  设置材质
         *  face: 正反面
         *      GL_FRONT:正面
         *      GL_BACK:反面
         *      GL_FRONT_AND_BACK:正反面
         *  pname:材质属性
         *      GL_AMBIENT:材质的环境颜色
         *      GL_DIFFUSE:材质的散射颜色
         *      GL_SPECULAR:材质的镜面反射颜色
         *      GL_EMISSION: 材质的发射光颜色
         *      GL_SHININESS:镜面反射指数,0~128 值越小越粗糙
         */
        
        glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
        glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
        glMaterialf (GL_FRONT, GL_SHININESS, mat_shininess);
    }
    
        
    //glutSolidSphere(100,30,30);
    glutSolidCube(80);
        
    glFlush();
    
    glutSwapBuffers();
    
}

//回调函数
void display_demo1_idle(){
   
   g_angle += 1;
   
   display_demo01();
}
原文地址:https://www.cnblogs.com/Fredric-2013/p/5657573.html