NeHe的OpenGL教程 lesson1-5 学习心得
2014-07-06 16:05
337 查看
这两天学习了NeHe的OpenGL教程的前5个课程,了解并掌握了OpenGL较为基础的知识:多边形的绘制,上色,旋转等。
1. X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
2. GL_TRIANGLES 三角形
GL_QUADS 正方形
GL_POLYGON 多边形
3. 我们使用顺时针次序来画正方形-左上-右上-右下-左下。采用顺时针绘制的是对象的后表面。这就是说我们所看见的是正方形的背面。逆时针画出来的正方形才是正面朝着我们的。
4. 使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。
glShadeModel(GL_FLAT)采取最后一点的颜色作为刚绘制的多边形的整体颜色。
glShadeModel(GL_SMOOTH)则采取渐变色绘制多边形。(默认为此模式)
彩色的多边形:
在windows消息循环机制中添加改变着色方式的代码(F2单调着色,F3平滑着色,默认为平滑着色模式)
旋转的3D体:
先设置全局变量
更新DrawGLScene函数
真正的挑战还在后面!坚持下去!
1. X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
2. GL_TRIANGLES 三角形
GL_QUADS 正方形
GL_POLYGON 多边形
3. 我们使用顺时针次序来画正方形-左上-右上-右下-左下。采用顺时针绘制的是对象的后表面。这就是说我们所看见的是正方形的背面。逆时针画出来的正方形才是正面朝着我们的。
4. 使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。
glShadeModel(GL_FLAT)采取最后一点的颜色作为刚绘制的多边形的整体颜色。
glShadeModel(GL_SMOOTH)则采取渐变色绘制多边形。(默认为此模式)
彩色的多边形:
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存 glLoadIdentity(); // 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); // 绘制三角形 glColor3f(1.0f,0.0f,0.0f); // 设置当前色为红色 glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点 glColor3f(0.0f,1.0f,0.0f); // 设置当前色为绿色 glVertex3f(-1.0f,-1.0f, 0.0f); // 左下 glColor3f(0.0f,0.0f,1.0f); // 设置当前色为蓝色 glVertex3f( 1.0f,-1.0f, 0.0f); // 右下 glEnd(); // 三角形绘制结束 glTranslatef(3.0f,0.0f,0.0f); // 右移3单位 glColor3f(0.5f,0.5f,1.0f); // 一次性将当前色设置为蓝色 glBegin(GL_QUADS); // 绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); // 左上 glVertex3f( 1.0f, 1.0f, 0.0f); // 右上 glVertex3f( 1.0f,-1.0f, 0.0f); // 左下 glVertex3f(-1.0f,-1.0f, 0.0f); // 右下 glEnd(); // 正方形绘制结束 return TRUE; // 一切 OK }
在windows消息循环机制中添加改变着色方式的代码(F2单调着色,F3平滑着色,默认为平滑着色模式)
int WINAPI WinMain( HINSTANCE hInstance, // 当前窗口实例 HINSTANCE hPrevInstance, // 前一个窗口实例 LPSTR lpCmdLine, // 命令行参数 int nCmdShow) // 窗口显示状态 { MSG msg; // Windowsx消息结构 BOOL done=FALSE; // 用来退出循环的Bool 变量 // 提示用户选择运行模式 if (MessageBox(NULL,"你想在全屏模式下运行么?", "设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO) { fullscreen=FALSE; // FALSE为窗口模式 } // 创建OpenGL窗口 if (!CreateGLWindow("cc's 颜色实例",640,480,16,fullscreen)) { return 0; // 失败退出 } while(!done) // 保持循环直到 done=TRUE { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // 有消息在等待吗? { if (msg.message==WM_QUIT) // 收到退出消息? { done=TRUE; // 是,则done=TRUE } else // 不是,处理窗口消息 { TranslateMessage(&msg); // 翻译消息 DispatchMessage(&msg); // 发送消息 } } else // 如果没有消息 { // 绘制场景。监视ESC键和来自DrawGLScene()的退出消息 if (active) // 程序激活的么? { if (keys[VK_ESCAPE]) // ESC 按下了么? { done=TRUE; // ESC 发出退出信号 } else // 不是退出的时候,刷新屏幕 { DrawGLScene(); // 绘制场景 SwapBuffers(hDC); // 交换缓存 (双缓存) } } if (keys[VK_F1]) // F1键按下了么? { keys[VK_F1]=FALSE; // 若是,使对应的Key数组中的值为 FALSE KillGLWindow(); // 销毁当前的窗口 fullscreen=!fullscreen; // 切换 全屏 / 窗口 模式 // 重建 OpenGL 窗口 if (!CreateGLWindow("cc's 颜色实例",640,480,16,fullscreen)) { return 0; // 如果窗口未能创建,程序退出 } } if (keys[VK_F2]) { glShadeModel(GL_FLAT); } if (keys[VK_F3]) { glShadeModel(GL_SMOOTH); } } } // 关闭程序 KillGLWindow(); // 销毁窗口 return (msg.wParam); // 退出程序 }
旋转的3D体:
先设置全局变量
GLfloat rtri; // 用于三角形的角度 GLfloat rquad; // 用于四边形的角度
更新DrawGLScene函数
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存 glLoadIdentity(); // 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 单位,并移入屏幕 6.0 glRotatef(rtri,0.0f,1.0f,0.0f); // 绕Y轴旋转三角形 glBegin(GL_TRIANGLES); // 绘制三角形 glColor3f(1.0f,0.0f,0.0f); // 设置当前色为红色 glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点 glColor3f(0.0f,1.0f,0.0f); // 设置当前色为绿色 glVertex3f(-1.0f,-1.0f, 1.0f); // 左下顶点 glColor3f(0.0f,0.0f,1.0f); // 设置当前色为蓝色 glVertex3f( 1.0f,-1.0f, 1.0f); // 右下顶点 glColor3f(1.0f,0.0f,0.0f); // 红色 glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (右侧面) glColor3f(0.0f,0.0f,1.0f); // 蓝色 glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下顶点 (右侧面) glColor3f(0.0f,1.0f,0.0f); // 绿色 glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的右下顶点 (右侧面) glColor3f(1.0f,0.0f,0.0f); // 红色 glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (后侧面) glColor3f(0.0f,1.0f,0.0f); // 绿色 glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的左下顶点 (后侧面) glColor3f(0.0f,0.0f,1.0f); // 蓝色 glVertex3f(-1.0f,-1.0f, -1.0f); // 三角形的右下顶点 (后侧面) glColor3f(1.0f,0.0f,0.0f); // 红色 glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (左侧面) glColor3f(0.0f,0.0f,1.0f); // 蓝色 glVertex3f(-1.0f,-1.0f,-1.0f); // 三角形的左下顶点 (左侧面) glColor3f(0.0f,1.0f,0.0f); // 绿色 glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的右下顶点 (左侧面) glEnd(); // 三角形绘制结束 glLoadIdentity(); // 重置模型观察矩阵 glTranslatef(1.5f,0.0f,-7.0f); // 右移1.5单位,并移入屏幕 6.0 glRotatef(rquad,1.0f,1.0f,1.0f); // 绕在XYZ轴上旋转立方体 glBegin(GL_QUADS); // 绘制正方形 glColor3f(0.0f,1.0f,0.0f); // 一次性将当前色设置为蓝色 glVertex3f( 1.0f, 1.0f, -1.0f); // 左上 glVertex3f(-1.0f, 1.0f,-1.0f); // 右上 glVertex3f(-1.0f, 1.0f, 1.0f); // 左下 glVertex3f( 1.0f, 1.0f, 1.0f); // 右下 glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色 glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右上顶点(底面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左上顶点(底面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(底面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(底面) glColor3f(1.0f,0.0f,0.0f); // 颜色改成红色 glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面) glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上顶点(前面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左下顶点(前面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右下顶点(前面) glColor3f(1.0f,1.0f,0.0f); // 颜色改成黄色 glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右上顶点(后面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左上顶点(后面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左下顶点(后面) glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右下顶点(后面) glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色 glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上顶点(左面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(左面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(左面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的右下顶点(左面) glColor3f(1.0f,0.0f,1.0f); // 颜色改成紫罗兰色 glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(右面) glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上顶点(右面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的左下顶点(右面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(右面) glEnd(); // 正方形绘制结束 rtri+=0.2f; // 增加三角形的旋转变量 rquad-=0.15f; // 减少四边形的旋转变量 return TRUE; // 一切 OK }
真正的挑战还在后面!坚持下去!
相关文章推荐
- NeHe的OpenGL教程 lesson6-8 学习心得
- WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
- opengl学习笔记1:vs2013 nehe教程第一课 创建窗口
- 【OpenGL】(NeHe教程学习)纹理映射及代码实现
- WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
- 【OpenGL】nehe教程第四、五课学习笔记
- 【OpenGL】nehe教程第二、三课学习笔记
- 【OpenGL】(NeHe教程学习)纹理映射及代码实现
- 【OpenGL】nehe教程第一课学习笔记
- NeHe的opengl教程delphi版(4)----旋转
- Jeff Molofee(NeHe) 的 OPENGL 教程-第一课
- NeHe的opengl教程delphi版(1)----基本框架
- 简单的透明:Jeff Molofee(NeHe) 的 OPENGL 教程-第八课
- 纹理滤波方式、光源:Jeff Molofee(NeHe) 的 OPENGL 教程-第七课
- 使用OpenGL VBO扩展 --Nehe教程
- 转起来:Jeff Molofee(NeHe) 的 OPENGL 教程-第四课
- NeHe的opengl教程delphi版(2)----创建三角形和四边形
- NeHe的opengl教程delphi版(6)----纹理映射(贴图)
- 漂亮的星星动画:Jeff Molofee(NeHe) 的 OPENGL 教程-第九课
- 简单的透明:Jeff Molofee(NeHe) 的 OPENGL 教程-第八课