zoukankan      html  css  js  c++  java
  • vs2008\drivers\opengl_2.h.c_opengl基本功能介绍+示例

    /**** openGL上的画点函数 即基本功能介绍 *****/
    /*****************************************************************************************
                                        功能
    文件  opengl_2.h
    编者:张永辉 2013年4月15日 整理
    *****************************************************************************************/
    #ifndef _OPENGL_2_H_
        #define _OPENGL_2_H_
        //函数声明
        void OpenGl_2Test(void);
    //****************************************************************************************
    #endif
    /*************************************openGL功能介绍**************************************
    1 一般的命名方式
    2 opengl基本函数集
    3 画点函数解说
    4 颜色
    5 坐标系
    6 综合实例(使用480*320显示)
    编者:张永辉 2012年11月17日
         张永辉 2013年04月15日 整理
    参考:
    http://blog.csdn.net/waterflier/article/details/222645
    ------------------------------------------------------------------------------------------
    1 一般的命名方式都是 xxxx[n][t] 。
        xxxx 表示函数的意义,
        [t] 用于表示此函数对应的类型。
            s 表示 16 位整数  (OpenGL 为 GLshort)
            i 表示 32 位整数  (OpenGL 为 GLint 和 GLsizei)
            f 表示 32 位浮点数(OpenGL 为 GLfloat)
            d 表示 64 位浮点数(OpenGL 为 GLdouble)
        [n] 表示参数个数
            如3,表示有3个参数(即点的 X,Y,Z 坐标)来表示顶点。

    2 opengl基本函数集
        OpenGL中绘制几何图元,必须使用glBegain()和glEnd()这一对函数,
        glBegain()的参数唯一确定了要绘制何种几何图元
        glEnd()标志顶点列表的结束
            glBegain()可以有如下参数:
                GL_POINTS           单个顶点集
                GL_LINES            多组双顶点线段
                GL_POLYGON          单个简单填充凸多边形
                GL_TRAINGLES        多组独立填充三角形
                GL_QUADS            多组独立填充四边形
                GL_LINE_STRIP       不闭合折线
                GL_LINE_LOOP        闭合折线
                GL_TRAINGLE_STRIP   线型连续填充三角形串
                GL_TRAINGLE_FAN     扇形连续填充三角形串
                GL_QUAD_STRIP       连续填充四边形串
            在glBegain() glEnd()之间,可以有以下函数
                glColor*()      设置当前颜色
                glIndex*()      设置当前颜色表
                glNormal*()     设置法向坐标
                glEvalCoord*()  产生坐标
                glCallList(),glCallLists() 显示列表
                glTexCoord*()   设置纹理坐标
                glEdgeFlag*()   控制边界绘制
                glMaterial*()   设置材质

    3 画点函数解说
        glVertex{234}{sifd}[V](TYPE cords)函数用来定义一个顶点.
            例如: glVertex2f(2.0f,3.0f);            //二维坐标定义顶点;

        e.g: 画点
            glClear ( GL_COLOR_BUFFER_BIT );        //清楚缓冲区的图像
            glPointSize(20);                        //设置点的宽度(以象素为单位),必须大于0.0,缺省时为1.0
            glBegin ( GL_POINTS );
                glVertex3f (-0.5, -0.5, 0.0);       //将绘制以此点为中心的,20*20的正方形。
                glVertex3f ( 0.5, -0.5, 0.0);
                glVertex3f ( 0.5,  0.5, 0.0);
                glVertex3f (-0.5,  0.5, 0.0);
            glEnd ();
            glFlush ();

        e.g:直线
            glClear ( GL_COLOR_BUFFER_BIT );
            glLineWidth (5);                        //线宽度
            glLineStipple (1, 0x8888);              //虚点线
            glEnable(GL_LINE_STIPPLE);              //必须启用虚点模式,才能画虚点。
                                                    //关闭时glDisable(GL_LINE_STIPPLE)
            glBegin ( GL_LINES );
                glVertex3f (-0.5,-0.5, 0.0);
                glVertex3f ( 0.5,-0.5, 0.0);
                glVertex3f ( 0.5, 0.5, 0.0);
                glVertex3f (-0.5, 0.5, 0.0);
            glEnd ();
            glFlush ();

        e.g: 多边形
            glClear( GL_COLOR_BUFFER_BIT );         //清楚缓冲区的图像
            glBegin( GL_POLYGON );                  //凸多边形
                glVertex2f (-0.5, -0.5);
                glVertex2f ( 0.5, -0.5);
                glVertex2f ( 0.5,  0.5);
                glVertex2f (-0.5,  0.5);
                glVertex2f ( 0.0,  1.0);
            glEnd();
            glFlush();
            //GL_TRIANGLES 表示三角形
            //GL_QUADS     表示四边形
            //GL_POLYGON   表示凸多边形

    4 颜色
        RGBA颜色
            R值(红色分量)
            G值(绿色分量)
            B值(蓝色分量)
            A值(alpha分量)  alpha不直接影响颜色,它将留待以后介绍.

        glColor*系列函数可以用于设置颜色,如下:
            void glColor3f(GLfloat red, GLfloat green, GLfloat blue);
            void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
            其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多。例如:
            如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。

    5 坐标系
        GL使用笛卡尔坐标系,即正常的XYZ坐标系。原点在屏幕中间。

    6 综合实例
        见本例
    *****************************************************************************************/

    /*****************************************************************************************
                                        在windows建立openGL
    文件  opengl_2.c
    张永辉 2012年11月15
    //环境VS2008  实验结果:能画出红绿蓝三个区域,但是太慢了点吧。
    *****************************************************************************************/
    #include <GL/glut.h>
    #pragma comment(lib, "opengl32.lib")
    #pragma comment(lib, "glu32.lib")
    #pragma comment(lib, "glut32.lib")
    #include "opengl_2.h"           //#include  "\embed\vs2008\dirvers\opengl_2.h"
    #define X_SIZE 480              //定义屏幕大小
    #define Y_SIZE 320

    static void DisPoint(unsigned int x,unsigned int y,unsigned short Color);   //画点函数
    static void DisClear(void);     //清屏函数
    static void myDisplay(void)     //绘图
    {
        int x = 0;
        int y = 0;
        DisClear();

        //绘制红色区域块
        for(x = 0;x < X_SIZE/3; x++)
        {
            for(y = 0;y <= Y_SIZE;y++)
            {
                DisPoint(x,y,0x1f<<11);
            }
        }

        //绘制绿色区域块
        for(x = X_SIZE/3; x < 2*X_SIZE/3; x++)
        {
            for(y = 0;y <= Y_SIZE;y++)
            {
                DisPoint(x,y,0x3f<<5);
            }
        }

        //绘制蓝色区域块
        for(x = 2*X_SIZE/3; x <= X_SIZE; x++)
        {
            for(y = 0;y <= Y_SIZE;y++)
            {
                DisPoint(x,y,0x1f);
            }
        }
    }

    //清屏,屏幕显示全黑
    static void DisClear(void)
    {
        glClear (GL_COLOR_BUFFER_BIT);
    }

    //x  x坐标位置 0... X_SIZE
    //y  y坐标位置 0... Y_SIZE
    //C  点的颜色  0... 65535  RGB565模式
    //坐标系:左上角(0,0)  右下角(X_SIZE,Y_SIZE)
    static void DisPoint(unsigned int x,unsigned int y,unsigned short Color)
    {
        float fx,fy;
        float fr,fg,fb;

        //--坐标--限定范围
        if(x > X_SIZE || y > Y_SIZE)
        {
            return;
        }

        //将x y转换成小数
        fx = ((float)(x*2))/X_SIZE;         //fx = [0..2]
        fy = ((float)(y*2))/Y_SIZE;         //fy = [0..2]

        fx = fx - 1;                        //坐标变换, x左移1个单位           fx =[-1..1]
        fy = 1 - fy;                        //坐标变换, y上移1个单位,然后反向 fy =[-1..1]

        //--颜色--变换,使用565模式
        fr = (float)((Color >> 11)&(0x1f)) /0x1f;
        fg = (float)((Color >> 5 )&(0x3f)) /0x3f;
        fb = (float)((Color      )&(0x1f)) /0x1f;
        glColor3f(fr,fg,fb);

        glBegin(GL_POINTS );
        glVertex2f (fx, fy);
        glEnd();
        glFlush();
    }

    void OpenGl_2Test(void)
    {
        //对下面的函数不理解的,请看上节内容
        //glutInit(&argc,   argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

        glutInitWindowPosition(100, 100);
        glutInitWindowSize(X_SIZE, Y_SIZE);

        glutCreateWindow("绘点演示程序");
        glutDisplayFunc(&myDisplay);

        glutMainLoop();
        return;
    }

  • 相关阅读:
    05、汇编语言--环境搭建
    04、计算机基础--编码
    03、计算机基础--数制
    02、计算机基础--8086处理器
    01、计算机基础--计算机概述
    06、JavaEE--SpringMVC
    04、Android系统--Android10
    03、Android系统--Android4.4
    App自动化测试工具Uiautomator2
    Python yaml文件读写
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3022906.html
Copyright © 2011-2022 走看看