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;
}

 

 

posted @ 2013-04-15 21:11  xinyuyuanm  阅读(236)  评论(0编辑  收藏  举报