OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。
初始化;
以下是引用片段:
BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR *ppfd; // pfd,
int pixelformat;
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), //固定值
1, //固定值
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER,
16, //程序在16位色彩下运行
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
ppfd = &pfd;
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 ) //选择象素格式
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE) //设置格式
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}
GLvoid TOpenGL_Form::initializeGL(GLsizei width, GLsizei height)
{
glClearIndex( (GLfloat)BLACK_INDEX); //
glClearColor(1.0,1.0,1.0,0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //清空Buffer
glClearDepth( 1.0 ); //清空Buffer
//void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);RGBA方式下的颜色//缓存
//void glClearIndex(GLfloat index);颜色表方式下的颜色缓存
//void glClearDepth(GLclampd depth); 颜色表方式下的深度缓存
//void glClearStencil(GLint s); 颜色表方式下的模板缓存
//void glClearAccum(GLflaot red,GLfloat green,GLfloat blue,GLfloat alpha); 颜色表方式下的累积缓//存
//void glClaear(Glbitfield mask);清除指定的缓存。参数mask可以是下面这些位逻辑的或
// GL_COLOR_BUFFER_BIT
// GL_DEPTH_BUFFER_BIT
// GL_STENCIL_BUFFER_BIT
// GL_ACCUM_BUFFER_BIT
*/
glEnable(GL_DEPTH_TEST); //使用 depth buffer
glMatrixMode( GL_PROJECTION ); //设置物体对象
/*-------------------------------------------------------------------------------------------------------------------------------
两个基本OpenGL矩阵操作函数:void glLoadMatrix{fd}(const TYPE *m)
设置当前矩阵中的元素值。函数参数*m是一个指向16个元素(m0,m1,...,m15)的指针,
这16个元素就是当前矩阵 M 中的元素,其排 列方式如下:
* *
* m0 m4 m8 m12 *
M =* m1 m5 m9 m13 *
* m2 m6 m10 m14 *
* m3 m7 m11 M15 *
* *
void glMultMatrix{fd}(const TYPE *m) 用当前矩阵去乘*m所指定的矩阵,并将结果存放于*m中。当前矩阵可以是用glLoadMatrix()指定的矩阵,也可以是其它矩阵变换函数的综合结果。
*************************几何变换**************************************************************
平移变换函数如下:void glTranslate{fd}(TYPE x,TYPE y,TYPE z)
旋转变换函数如下:void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z)
缩放和反射变换函数如下:void glScale{fd}(TYPE x,TYPE y,TYPE z)
*************************投影变换**************************************************************
在进行投影变化前,必须加上下面两个函数glMAtrixMode(GL_PROJECTION);glLoadIdentity();
正射投影函数共有两个,一个函数是:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);另一个函数是:void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
透视投影函数共有两个,一个函数是:void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);另一个函数是:void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);
*************************裁切变换**************************************************************
在OpenGL中,空间物体的三维裁剪变换包括两个部分:视景体裁剪和附加平面裁剪。视景体裁剪已经包含在投影变换里;附加平面裁剪函数为:void glClipPlane(GLenum plane,Const GLdouble *equation);在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi),使得当前所定义的裁剪平面有效;当不再调用某个附加裁剪平面时,可用glDisable(GL_CLIP_PLANEi)关闭相应的附加裁剪功能。
*************************视角变换**************************************************************
OpenGL中相关函数是:glViewport(GLint x,GLint y,GLsizei width, GLsizei height);
*************************矩阵堆栈的操作********************************************************
堆栈操作函数有以下两个:void glPushMatrix(void);void glPopMatrix(void);
-------------------------------------------------------------------------------------------------------------------------------------------*/