Oct
OpenGL程序设计笔记 #1
Posted in Uncategorized | No Comments »#include <windows.h> // Standard Header For Most Programs
#include <gl/gl.h> // The GL Header File
#include <gl/glut.h> // The GL Utility Toolkit (Glut) Header
float rquad; // Angle For The Quad
int main ( int argc, char** argv )
{
glutInit ( &argc, argv );
//这是用来初始化glut的部分,所以一定要写在所有glut函数的前面。
glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE );
|
glutInitDisplayMode()用来设置显示方式,上面列出的显示方式为GLUT_RGBA和GLUT_DOUBLE,分别意味着使用的是RGBA[Red, Green, Blue, Alpha]和双缓冲。此函数可以选择的参数有以下几类: 1. 颜色显示方式,包括GLUT_INDEX和GLUT_RGBA,后者为默认,使用前者会覆盖后者。如果使用GLUT_INDEX,那么后面选择颜色就要使用glIndexs()来指定调色盘中的颜色,而前者则使用glColor*()函数来指定颜色 2. 缓冲区选择,包括GLUT_ACCUM,GLUT_ALPHA,GLUT_DEPTH和GLUT_STENCIL四种不同的缓冲区。在开始的时候并不一定会用到它们,但是还是在这里说明一下。OpenGL中有四种重要的缓冲器,分别是Accumulation buffer, Alpha buffer, Depth buffer和stencil buffer。 Accumulation Buffer是一种数据结构,它包含了需要绘制的像素的RGBA信息。Accumulation Buffer提供了由Accum函数支持的5种操作,分别是ACCUM,LOAD,RETURN,MULT和ADD。用这五种操作将一个新的值累加至这个缓冲器当中。关于Accumulation buffer的具体内容可以参考 Alpha Buffer其实是Color Buffer中的一部分,里面保存了每个像素的Alpha值,也就是透明度 Depth Buffer保存了每个像素点的深度信息。比如两个空间中的三角形,前面的对后面的构成了遮挡,那么后面那个三角形中被遮挡的部分的depth就会和前面的不一样,这部分的像素就不会被画出来。 Stencil Buffer顾名思义代表一张“蜡纸”。在应用此模式绘图时,首次绘图可以指定那些位置被刻下来那些位置不刻,那么在接下来绘图的时候就可以只绘制被刻的部分。 3. 指定缓冲方式,包括GLUT_SINGLE和GLUT_DOUBLE,前者为单缓冲,默认,后者为双缓冲,使用时会覆盖掉SINGLE选项。双缓冲的原理有点类似电影院里两台放映机。 |
glutInitWindowSize ( 500, 500 );
初始化窗口大小
glutCreateWindow ( "NeHe's OpenGL Framework" );
创建窗口
glutFullScreen ( );
全屏
InitGL ();
初始化GL设置。注意和前面的glutInit是不一样地。
glutDisplayFunc ( display );
回调函数,调用你自己写的display函数。所谓回调的意思就是你调用一个库函数,这个库函数又反过来调用你写的函数。你所要绘制的一帧图像的全部内容都需要在display中体现出来。
glutReshapeFunc (reshape);
也是一个回调函数,reshape函数指的是当窗口大小经过调整后会出现什么情况。
glutKeyboardFunc ( keyboard );
回调函数,响应键盘动作。
glutSpecialFunc ( arrow_keys );
回调函数,响应任何其他动作。
glutIdleFunc ( display );
回调函数,指明什么都不做的时候干什么。
glutMainLoop ( ); // Initialize The Main Loop
初始化主循环,回到首次使用DisplayFunc的地方。
上面几个函数的顺序是固定的。
}
void InitGL ( GLvoid ) // Create Some Everyday Functions
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
指定Shade方式,OpenGL官方意思是SMOOTH其实是对primitive图形进行了插值处理。
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
深度测试检验函数,里面的参数用来指明传入的像素的深度和已经在缓存区中函数的关系,只有当这个关系的逻辑表达式值为真时才画出来。
glEnable ( GL_COLOR_MATERIAL );
这个还不清楚
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
一系列的额外选项,参考
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/hint.html
}
void display ( void ) // Create The Display Function
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
// glLoadIdentity(); // Reset The Current Modelview Matrix
glPushMatrix();
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-6.0f); // Move Right 1.5 Units And Into The Screen 6.0
glRotatef(rquad,1.0f,0.0f,0.0f); // Rotate The Quad On The X axis
glColor3f(0.5f,0.5f,1.0f); // Set The Color To Blue One Time Only
glutWireCube(1.0f);
glPopMatrix();
rquad-=0.15f; // Decrease The Rotation Variable For The Quad ( NEW )
glutSwapBuffers ( );
// Swap The Buffers To Not Be Left With A Clear Screen
}
void reshape ( int width , int height ) // Create The Reshape Function (the viewport)
{
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();
}
void keyboard ( unsigned char key, int x, int y ) // Create Keyboard Function
{
switch ( key ) {
case 27: // When Escape Is Pressed...
exit ( 0 ); // Exit The Program
break; // Ready For Next Case
default: // Now Wrap It Up
break;
}
}
void arrow_keys ( int a_keys, int x, int y ) // Create Special Function (required for arrow keys)
{
switch ( a_keys ) {
case GLUT_KEY_UP: // When Up Arrow Is Pressed...
glutFullScreen ( ); // Go Into Full Screen Mode
break;
case GLUT_KEY_DOWN: // When Down Arrow Is Pressed...
glutReshapeWindow ( 500, 500 ); // Go Into A 500 By 500 Window
break;
default:
break;
}
}
