开始学习用OpenGL,也就想显示一些点,以为挺简单的,哎,看了两天才会画三维的点,做个总结。
使用OpenGL的基本流程
int main(int argv, char *argc[]) { //初始化glut glutInit(&argv, argc); //初始化显示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //设置窗口大小 glutInitWindowSize(800, 600); //创建窗口 glutCreateWindow("Point Demo"); //注册回调函数 glutReshapeFunc(onChangeSize); glutDisplayFunc(onRender); glutSpecialFunc(onSpecialKeyFunc); setupRenderingContext(); glutMainLoop(); return 0; }
主要是glut库进行了一些初始化操作,并注册需要的回调函数(事件处理函数)。
glutReshapeFunc 窗口大小发生改变的时候调用注册函数
glutDisplayFunc 显示的时候调用的函数,各种的画图操作都在这里进行
glutSpecialFunc 特殊按键(上、下、左、右)按下时调用的函数
还有其他的一些回调函数,例如:窗口关闭时,这里不再一一赘述。
setupRenderingContext 设置渲染的上下文(渲染环境)
glutMainLoop 进入主消息循环
函数名称的一个简单说明glut开头的是glut库的一些函数,gl开头的则是标准的OpenGL库的函数。由于OpenGL没有提供诸如窗口管理、输入输出以及按键等的处理函数,所以需要一些OpenGL的扩展库
来处理这些操作,并且OpenGL官方也提倡开发一些扩展库。glut是OpenGL中比较常见的一种。
回调函数及渲染环境设置
窗口大小改变时的回调函数
//窗口大小改变的回调函数 void onChangeSize(GLint w,GLint h){ //横宽比 GLfloat ratio; //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f) GLfloat coordinateSize = 100.0f; //设置视口和窗口大小一样 glViewport(0, 0, w, h); //对投影矩阵应用随后的矩阵操作 glMatrixMode(GL_PROJECTION); //重置当前指定的矩阵为单位矩阵 glLoadIdentity(); ratio = (GLfloat)w / (GLfloat)h; //正交投影 if (w < h) glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize); else glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize); //对模型视图矩阵堆栈应用随后的矩阵操作 glMatrixMode(GL_MODELVIEW); //重置当前指定矩阵为单位矩阵 glLoadIdentity(); }
设置所使用的坐标系以及视口(viewport),坐标系、视口以及一些矩阵变换另作总结,这里不详述。
Display时的回调函数
//渲染 void onRender(){ //清理 glClear(GL_COLOR_BUFFER_BIT); //将当前matrix状态入栈 glPushMatrix(); glRotatef(xRotAngle, 1.0f, 0.0f, 0.0f); glRotatef(yRotAngle, 0.0f, 1.0f, 0.0f); glBegin(GL_POINTS); srand((unsigned)time(NULL)); GLfloat x, y, z; for (int i = 0; i < 1000; i ++){ x = rand() % 201 - 100; y = rand() % 201 - 100; z = rand() % 201 - 100; glVertex3f(x, y, z); } glEnd(); //恢复栈的Matrix glPopMatrix(); //交换两个缓冲区 glutSwapBuffers(); }
生成1000个随机的三维点,作图的操作主要这里进行。
设置渲染环境
//设置Rendering context void setupRenderingContext() { //设置clear color为黑色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //设置绘图颜色 glColor3f(1.0f, 1.0f, 0.0f); }
设置了背景色以及绘图的前景色
特殊按键回调函数
void onSpecialKeyFunc(GLint key, GLint x, GLint y){ if (key == GLUT_KEY_UP){ xRotAngle -= 5.0f; } else if (key == GLUT_KEY_DOWN){ xRotAngle += 5.0f; } else if (key == GLUT_KEY_LEFT){ yRotAngle -= 5.0f; } else if (key == GLUT_KEY_RIGHT){ yRotAngle += 5.0f; } //重新绘制 glutPostRedisplay(); }
按下上、下、左、右键时进行旋转
结果
总结
简单的OpenGL使用框架
//设置Rendering context void setupRenderingContext() { //设置clear color为黑色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //设置绘图颜色 glColor3f(1.0f, 1.0f, 0.0f); } //窗口大小改变的回调函数 void onChangeSize(GLint w,GLint h){ //横宽比 GLfloat ratio; //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f) GLfloat coordinateSize = 100.0f; //设置视口和窗口大小一样 glViewport(0, 0, w, h); //对投影矩阵应用随后的矩阵操作 glMatrixMode(GL_PROJECTION); //重置当前指定的矩阵为单位矩阵 glLoadIdentity(); ratio = (GLfloat)w / (GLfloat)h; //正交投影 if (w < h) glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize); else glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize); //对模型视图矩阵堆栈应用随后的矩阵操作 glMatrixMode(GL_MODELVIEW); //重置当前指定矩阵为单位矩阵 glLoadIdentity(); } //渲染 void onRender(){ //清理 glClear(GL_COLOR_BUFFER_BIT); //TODO:主要操作在这里 //交换两个缓冲区 glutSwapBuffers(); } int main(int argv, char *argc[]) { //初始化glut glutInit(&argv, argc); //初始化显示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //设置窗口大小 glutInitWindowSize(800, 600); //创建窗口 glutCreateWindow("Point Demo"); //注册回调函数 glutReshapeFunc(onChangeSize); glutDisplayFunc(onRender); setupRenderingContext(); glutMainLoop(); return 0; }
时间: 2024-10-11 12:35:56