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