• 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();
    }
  • 相关阅读:
    最实用的深度学习教程 Practical Deep Learning For Coders (Kaggle 冠军 Jeremy Howard 亲授)
    线性代数的本质与几何意义 01. 向量是什么?(3blue1brown 咪博士 图文注解版)
    【小蜜蜂老师主讲】基于STM32CubeMX的嵌入式开发基础教程
    【STM32专题教程】STM32CubeMX的安装与快速入门
    【技能大赛真题】2019年物联网国赛任务三题1-无线通信系统
    【CC2530强化实训03】定时器间隔定时实现按键长按与短按
    【CC2530强化实训04】定时器间隔定时实现按键N连击
    【CC2530强化实训02】普通延时函数实现按键的长按与短按
    【CC2530强化实训01】普通延时函数实现按键的长按与短按
    【蓝桥杯单片机12】实时时钟DS1302的基本操作
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/5657573.html
Copyright © 2020-2023  润新知