zoukankan      html  css  js  c++  java
  • opengl 笔记(1)

    参考《opengl入门教程》、《OpenGL之坐标转换》、《OpenGL绘制管线操作细节》等资料。

    复习下留个备忘:)

    /*-
     * Opengl Demo Test
     *
     * Fredric  : 2016-7-8
     */
    #include <GLUT/GLUT.h>
    
    void display_demo01();
    
    void display_demo02();
    
    void display_demo03();
    
    void display_demo04();
    
    /*
     *   Main Function
     */
    int main(int argc, char ** argv)
    {
        /*  glutInit
         *  GLUT初始化
         */
        glutInit(&argc, argv);
        
        /*
         *  int glutCreateWindow(char* name);
         *  产生一个顶层窗口
         *  char* name:窗口名称
         * return int:窗口标记符号,可以glutGetWindow获取引用
         */
        glutCreateWindow("Fredric Practice Demo");
        
        
        /*
         *  void glutDisplayFunc(void (*func)(void));
         *  为当前窗口设置显示回调函数
         */
        glutDisplayFunc(display_demo04);
        
        
        /*
         * void glutMainLoop()
         * glut程序进入事件循环
         */
        glutMainLoop();
        
    }
    
    //****************************************************************************
    
    /*
     * 基础显示函数demo
     */
    void display_demo01(){
        
        /*
         *  void glClear(GLbitfield mask);
         *  根据mask的要求清除缓冲值
         *  GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲
         *  GL_DEPTH_BUFFER_BIT:    深度缓冲
         *  GL_ACCUM_BUFFER_BIT:   累积缓冲
         *  GL_STENCIL_BUFFER_BIT: 模板缓冲
         */
        glClear(GL_COLOR_BUFFER_BIT);
        
        
        /*
         *  void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
         *  等价于:
         *  glBegin(GL_POLYGON);
         *  glVertex2(x1, y1);
         *  glVertex2(x2, y1);
         *  glVertex2(x2, y2);
         *  glVertex2(x1, y2);
         *  glEnd();
         *  在opengl的世界坐标系中,(0,0,0)是屏幕中心的原点,整个窗口范围为-1到1
         *  在下例中绘制的矩形覆盖全部窗口
         */
        glRectf(-1.0f, -1.0f, 1.0f, 1.0f);
        
        /*
         * opengl命令立即执行
         */
        glFlush();
    }
    
    //****************************************************************************
    
    /*
     *  绘制基本图形demo
     */
    void display_demo02(){
        
        //绘制点
        glClear(GL_COLOR_BUFFER_BIT);
        
        /*
         * 限定一组或多组图元的定义
         */
        glBegin(GL_POINTS);
        /*
         * void glPointSize(    GLfloat size);
         * 定义栅格点的大小,初始大小为1
         */
        glPointSize(5.0f);
        glVertex2f(-0.5f, 0.0f);
        glVertex2f(0.0f, 0.0f);
        glVertex2f(0.5f, 0.0f);
        glEnd();
        glFlush();
        
        //绘制直线
        glClear(GL_COLOR_BUFFER_BIT);    
        glBegin(GL_LINES);
        
        //下例中会绘制两条直线
        glVertex2f(-0.5f, 0.0f);
        glVertex2f(0.5f, 0.0f);
        
        glVertex2f(-0.5f, -0.3f);
        glVertex2f(0.5f, 0.3f);
        glEnd();
        glFlush();
        
        //绘制多边形
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_POLYGON);
        glVertex2f(-0.5f, 0.0f);
        glVertex2f(0.5f, 0.0f);
        glVertex2f(-0.5f, -0.3f);
        glVertex2f(0.5f, 0.3f);
        glEnd();
        glFlush();
        
        
        //绘制圆
        int n = 40;
        float pi = 3.1415926;
        float d  = 0.5f;
        
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_POLYGON);
        
        for(int i = 0; i < n; i++){
            glVertex2f(d*cos(2*pi/n*i), d*sin(2*pi/n*i));
        }
        
        glEnd();
        glFlush();
        
    }
    
    //*********************************************************************************
    
    /*
     * 颜色基本处理demo
     */
    void display_demo03(){
        
        float pi = 3.1415926;
        
        glClear(GL_COLOR_BUFFER_BIT);
        
        glBegin(GL_TRIANGLE_FAN);
        
        /*
         *  void glColor3f (GLfloat red, GLfloat green, GLfloat blue);
         *  RGB 三原色值
         */
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex2f(0.0f, 0.0f);
        for(int i=0; i<=8; ++i) {
            glColor3f(i * 0x04, 0, 0);
            glVertex2f(cos(i*pi/4), sin(i*pi/4));
        }
        glEnd();
        glFlush();
    }
    
    //***********************************************************************************
    
    /*
     * 绘制立体基本形状demo
     * 在opengl的绘制管线中,主要分为两部分工作:
     * 1、模型观测变化:即具体物体的现实位置和角度
     * 2、投影变换:即将3维信息的图像影射到2维的屏幕中
     * 此过程中,涉及6个坐标:
     * 1、属于模型观测变换:
     * 1.1、MC(Model Coordinate) -> 模型坐标,即物体对象自己的坐标,如我们说一个正方形的定点1,1,是相对自己的某个原点0,0;
     * 1.2、WC(Word Coordinate) -> 世界坐标,将N多物体的模型坐标,统一到一个公共的坐标系;
     * 1.3、VC(View Coordinate) -> 观测坐标,理解为观察的角度,即相机摆放的位置和角度
     * 2、属于投影变换:
     * 2.1、PC(Project Coordinate) -> 将上述模型变换后的3维信息映射到2维平面上,分为正交、斜投影、透射投影等,其中透射投影包涵近小远大的概念;
     * 2.2、NC(Normalization Coordinate) -> 将投影变换的结果归一化到一个单位为1的空间内
     * 3、视口变换:
     * 3.1 DC(Device Coordinate) -> 实际在设备即屏幕上显示的坐标
     */
    void display_demo04(){
        
        /*
         *  opengl功能启用,例如:
         *  GL_DEPTH_TEST:启用深度测试,根据坐标远近实现遮挡
         *  GL_ALPHA_TEST:根据其透明程度看是否被遮挡
         *  GL_AUTO_NORMAL:能够进行光线反射
         *  GL_TEXTURE_2D:启用二维纹理
         */
        glEnable(GL_DEPTH_TEST);
        
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        
        
        /*
         *  void glMatrixMode (GLenum mode);
         *  GL_PROJECTION: 对投影视图进行操作
         *  GL_MODELVIEW:  对模型视图进行操作
         *  GL_TEXTURE:    对纹理进行操作
         */
        glMatrixMode(GL_PROJECTION);
        
        //把当前矩阵设置为单位矩阵
        glLoadIdentity();
        
        /*
         *  void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 
         *  fovy:视角
         *  aspect:宽高比
         *  zNear:近点距离
         *  zFar:远点距离
         */
        gluPerspective(75, 1, 1, 1000);
        
        glMatrixMode(GL_MODELVIEW);
        
        glLoadIdentity();
        
        /*
         *  gluLookAt (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ)
         *  eyeX/Y/Z:相机在世界坐标中的位置
         *  centerX/Y/Z:物体在世界坐标中的位置
         *  upX/Y/Z: 相机的方向(相对世界坐标系)
         */
        gluLookAt(0, -100, 200, 0, 50, 10, 0, 0, 1);
        
        glColor3f(1.0f, 0.5f, 0.0f);
        
        /*
         *  glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
         *  angle:旋转的方向
         *  x/y/z: 旋转的方向向量
         */
        glRotatef(-80.0f,10.0f,5.0f,0.0f);
        
        /*
         *  void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
         *  radius:半径
         *  slices:经线数量
         *  stacks:纬线数量
         */
        glutWireCube(100);
        
        glFlush();
        
    }
  • 相关阅读:
    Erlang学习记录:转义
    Erlang学习记录:运算符
    Erlang学习记录:语法和特性
    Erlang学习记录:相关工具和文档
    IDEA快捷键(收集自网络后整理)
    Redis学习
    SQL_server_2008_r2和visual studio 2010旗舰版的安装(2013-01-16-bd 写的日志迁移
    oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移
    win7在某个盘或文件夹中出现右键只能新建文件夹的情况 (2012-12-28-bd 写的日志迁移
    宏基笔记本升级bios(2012-12-28-bd 写的日志迁移
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/5657122.html
Copyright © 2011-2022 走看看