int InitGL(GLvoid)
在自定义的CreateGLWindow函数中调用了InitGL函数,它用来初始化OpenGL,实现如下所示:
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}
上面:
glShadeModel函数用来设置阴影的效果,主要有GL_SMOOTH和GL_FLAT两种效果,其中GL_SMOOTH为默认值,表示平滑阴影效果;
glClearColor函数设置背景颜色,参数基于RGBA颜色模型,需要4个分量的颜色值;
glClearDepth函数设置深度缓冲区的,它的含义就在OpenGL窗口绘制的图形深入到屏幕中的程度,深度的意义就是在三维空间中的z坐标的数值,z取0时表示在平面上,你就看不到窗口中的图形了,所以负值越小,越远离窗口平面向里,说明窗口中的图形离我们观察者的距离变远了;
glEnable(GL_DEPTH_TEST); 用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作;
glDepthFunc(GL_LEQUAL);在调用glEnable(GL_DEPTH_TEST); 开启这个功能以后,当深度变化小于等于当前深度值时,更新深度值。
glHint函数用来规范OpenGL的行为的,使得图形能够更好地被控制以显示在窗口中。
int DrawGLScene(GLvoid)
然后,为了在OpenGL窗口中进行绘图操作,需要设定一个场景,在DrawGLScene函数中实现:
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix
return TRUE; // Everything Went OK
}
上面:
glClear函数用来清除屏幕为一种指定的颜色,也就是通过glClearColor函数指定的颜色,来设定当前屏幕的颜色;
glLoadIdentity函数是用一个4*4单位矩阵来替换当前的矩阵。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
在创建一个OpenGL窗口完成之后,需要对这个窗口进行初始化,是在ReSizeGLScene函数中实现的:
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height==0) // Prevent A Divide By Zero By
{
height=1; // Making Height Equal One
}
glViewport(0,0,width,height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
上面:
glViewport函数用来设置在窗口中的视区的,即我们要在该函数指定的视区内所能观察的范围;
glMatrixMode函数用来设置当前矩阵模式的,在设定的矩阵模式基础之上,可以进行矩阵运算来进行各种变化,它有三个取值:
GL_MODELVIEW 模型视图矩阵
GL_PROJECTION 投影矩阵
GL_TEXTURE 纹理矩阵
gluPerspective函数设置视景,即观察者能够看到的窗口中的图形的状态,它主要是在前面进行的矩阵设置基础之上,根据参数进行矩阵运算。
总结
在学习中:
InitGL函数中初始化一般不需要变化了;
如果要进行场景的设置,可以通过在ReSizeGLScene函数中进行设置;
如果要实现一些画图的操作,当然是在DrawGLScene函数中进行编程。