zoukankan      html  css  js  c++  java
  • opengl (1) 基本API的熟悉

    代码从此处下载 

    1 运行如下代码,可以看到如下效果,我们利用opengl画出一个三角形。

    void renderScene(void)
    {
        /*
        glClear清除缓冲区
        */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        /*
        将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
        1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
        2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
        3.中心左面的坐标值是负值,右面是正值。
        移向屏幕顶端是正值,移向屏幕底端是负值。
        移入屏幕深处是负值,移出屏幕则是正值。
        */
        glLoadIdentity();
    
        /*
        画出三个顶点,根据这三个顶点链接成一个凸包
        */
    
        glBegin(GL_TRIANGLES);//GL_TRIANGLES三角形
        glVertex3f(-1.0, -1.0, 0.0);
        glVertex3f(1.0, 0.0, 0.0);
        glVertex3f(0.0, 1.0, 0.0);
        glEnd();
    
        /*
        双缓冲模式
        与 glutInitDisplayMode(GLUT_RGBA) 对应
        */
        glutSwapBuffers();
    }

    这个代码中需要解释的是glLoadIdentity(),假如这个函数去掉,当我们窗口大小变化的时候,窗口中的所有东西都会消失。

    这个小小的细节涉及到opengl的渲染机制,opengl有个变化矩阵堆栈,opengl中的每个定义好的将要渲染的矩阵呈现之前都要先乘以栈顶的矩阵。glLoadIdentity()将栈顶的矩阵设置为固定不变的单位矩阵,所以当窗口大小变化需要重绘窗口的时候,就可以就可以保持不变了。

    其他情况类似的情况如下:

    glTranslatef:将T(x,y,z)右乘与堆栈的栈顶变换矩阵。右乘的解释,假设目前栈顶变换矩阵为M,那么就相当于把M修改为M*T.
    glRotatef :将R(x,y,z,s)右乘与堆栈的栈顶变换矩阵。
    glLoadIdentity:将堆栈的栈顶变换矩阵设置成单位矩阵。
    glPushMatrix:将堆栈的栈顶变换矩阵复制一份,然后Push到堆栈中。所谓Push,就像塞子弹一样把一个矩阵压入到堆栈中,此时,栈顶就是这个新的矩阵了,注意定义的向量都是和栈顶变换矩阵作用的。

    glPopMatrix:将堆栈的栈顶变换矩阵Pop出来。

    更多细节参考  http://wenku.baidu.com/view/a4f5748fcc22bcd126ff0c1a.html

    2 关于视图显示 glViewport();glOrtho();

    void renderScene_1(void)
    {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    
        /* 
        画笔的颜色
        */
        glColor3f(1.0, 1.0, 0.0);
        
        glLoadIdentity();
        
        /* 
        http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f 
        http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 
        glOrtho获取截屏
        procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);
        拉伸之后放在glViewPort上,
        根据glViewPort(x, y, width, height)
        放在总的窗口上的(x, y)坐标上
        */
    
        glViewport(50, 50, 300, 300);
        glOrtho(0.25, 0.25, 0.75, 0.75, -0.0, 0.5);
    
        /* 
        画一个正方形
        */
    
        glBegin(GL_POLYGON);
        {
            glVertex3f(0.25, 0.25, 0.0);
            glVertex3f(0.75, 0.25, 0.0);
            glVertex3f(0.75, 0.75, 0.0);
            glVertex3f(0.25, 0.75, 0.0);
        }
        glEnd();
    
        /* 
        双缓冲渲染
        */
    
        glutSwapBuffers();
    }

    http://hi.baidu.com/xun1573/item/a872977f9fbbbd366cc37c6f

    http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html

  • 相关阅读:
    学习进度06
    求最大子数组03
    js实现标签绑定回车事件
    ImageDown
    ImageUpload
    XMLProcess
    VideoConvert
    SmtpServerHelper
    SharpZip(压缩帮助类)
    SessionHelper
  • 原文地址:https://www.cnblogs.com/zhxfl/p/3320246.html
Copyright © 2011-2022 走看看