zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    记第一次为开源代码报漏洞
    入职第三周——总结前两周学习内容
    入职一星期之感想
    毕业季之礼
    基于mint-ui的移动应用开发案例二(项目搭建)
    基于mint-ui的移动应用开发案例一(简介)
    工作笔记一——杂项
    微信小程序实战小小应用——豆瓣电影
    React学习之坑(二)- 基础入门
    React学习笔记(一)- 环境搭建
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/5657573.html
Copyright © 2011-2022 走看看