2015年3月25日星期三

OpenGL学习笔记整理(一)

代码如下
#ifdef _APPLE_
#include   //OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include    //Windows/Linux FreeGlut equivalent
#endif

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("3D Effects Demo");
glutReshapeFunc(ChangeSize);
glutKeyboardFunc(KeyPressFunc);
glutDisplayFunc(RenderScene);

SetupRC();

glutMainLoop();
glDeleteTextures(4,textures);
return0;
}
代码中所示的几个函数,算是最入门级别的,还是整理下吧。

gluInit(&argc,argv) 初始函数,对GLUT进行初始化,必须在使用其他GLUT前调用

glutInitDisplayMode 设置显示模式,GLUT_DOUBLE为双缓冲,GLUT_RGBA私用RGBA颜色模式,GLUT_DEPTH使用深度缓存,GLUT_SINGLE使用单缓存。单缓冲区的窗口因为这所有的绘图命令都在显示的窗口中执行,双缓冲的窗口中执行绘图命令世纪上是在画面以外创建一个场景,然后很快交换到窗口的视图中来,常用于产生动画效果。

glutInitWindowSize 设置窗口大小

glutCreateWindow(“title”) 创建窗口,参数为标题名


glutDisplayFunc(RenderScene) 将先前定义的函数RenderScene设为回调函数,意味着只要需要绘制窗口,GLUT就会调用这里指定的函数,例如,在第一次显示窗口或改变窗口大小或移去窗口上覆盖的其他窗口时就会发生调用 

glutReshapeFunc(ChangeSize);
用户可以自己写一个函数,然后接收两个参数之后,做一定的工作。通常是为了避免在窗口大小变化的过程中显示的内容扭曲失真。
示例:
void ChangeSize(int w , int h)
{
glViewport(0,0,w,h);
}
glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
用户可以自定义一个键盘响应函数,它有三个参数,第一个用来接收键盘按键的ASCII值,后两个是鼠标在屏幕上的位置。
glutDisplayFunc(RenderScene) 
void RenderScene(void)
{
glClear(Gl_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glColor3f(1.0f,1.0f,1.0f);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glScalef(1.0f,2.0f,1.0f);
glutWireCube(1.0);
glutSwapBuffers();
}

glClear 在每次重画前,把上次画的东西清除掉

SetupRC()是我们进行OpenGL初始化的地方,初始话必须在渲染之前进行。OpenGL的许多状态只需要设置一次,而不必没渲染一帧(全部图形的一个场景)就重新设置一次。

glutMainLoop() 此函数让GLUT框架开始运行,在为屏幕显示和其他函数定义了回调之后,请放开GLUT的缰绳吧,这个函数会处理所有特定于操作系统

程序在实际中的初始运行顺序,main入口->SetupRc->changeSize->RenderScene

OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC,SetupRC负责 )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC).要注意的是,程序 运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。


没有评论:

发表评论