OpenGL(C++)培训

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenGL入门培训[C++]
陈治
课程目的
OpenGL简介 绘制模型 视图变换
OpenGL是什么
Open Graphics Language 一套规范 一套接口(函数)规范(API) 一套3D图形编程接口规范 一套硬件与编程语言的3D图形接口规范
硬件(显卡)和编程语言的桥梁
掌握OpenGL需具备的知识
模型视图矩阵
投影矩阵 透视矩阵 视口变换
当前变换矩阵堆栈
glPushMatrix() 圧栈
glPushMatrix()
出栈
资料
ftp://10.5.90.10/temp/OpenGL_Train/
作业
构建一个3D场景 绘制坐标系 网格方式绘制XY平面 XY平面四个象限(5,5)位置分别放置四个 物体(三角形,正方形,立方体,四面体) 设置四个观察点,用键盘切换
值 • 设置视角和
点数据
• 指定纹理或 颜色
变换矩阵
模型绘制
OpenGLES中去掉了glBegin和glEnd函数, 只能使用定点数组进行绘制
定义空间点
定义每个点的
颜色
使用索引定义
点的绘制顺序
指定绘制样式
进行绘制
顶点数组绘制法
glVertexPointer(int size,int type,int stride,Buffer pointer) size: 每个顶点有几个数指描述。必须是2,3 ,4 之一,初始值是4. type: 数组中每个顶点的坐标类型。取值:GL_BYTE, GL_SHORT , GL_FIXED , GL_FLOAT, 初始值 GL_FLOAT stride: 数组中每个顶点间的间隔,步长(字节位移)。取值若为0,表示数组是连续 的 初始值为0 pointer It's your array ,存储着每个顶点的坐标值。初始值为0
Fra Baidu bibliotek目的
图形学基 础
绘制3D图形
构建虚拟的世界
计算机
空间几何 线性代数
数学
光学知识 动力学
物理
艺术 3维建模 材质 光照
硬件渲染原理 | API使用方法
OpenGL编程架构
OpenGL特点
跨硬件 跨系统 跨语言
OpenGL可以做什么
完成模型渲染 计算透视和变换矩阵
光照计算
纹理贴图

遮盖关系
设置渲染模式
OpenGL库函数的命名规律
<库前缀><根命令><可选的参数个数><可选的参数类型>
glColor3f(1.0,0.0,0.0);
OpenGL编程模型
初始化 OpenGL • 不同平台初
设置渲染 参数 • 设置需要的
指定模型 数据 • 指定模型顶
交换缓冲 • 输出到屏幕
始化方法不
一样
OpenGL状态
顶点数组绘制法
//开启状态位 glEnableClientState(GL_VERTEX_ARRAY); //启用顶点数组 glEnableClientState(GL_COLOR_ARRAY); //启用颜色数组 //指定数据 glVertexPointer(3,GL_FLOAT,0, vertices); //设置三角形顶点 glColorPointer(4,GL_FLOAT, 0, colors); //设置颜色 //绘制 glDrawElements(GL_TRIANGLE_STRIP, 3, GL_UNSIGNED_BYTE, indices);
贴图
贴图尺寸
常宽尺寸需要是2的平方
贴图步骤1 纹理环境参数
开启贴图功能
glEnable(GL10.GL_TEXTURE_2D);
激活贴图
glActiveTexture(GL10.GL_TEXTURE0);
生成纹理ID int a[10]
glGenTextures(3, a, 5);
OpenGL数据类型
前缀 b s i f d ub us ui 数据类型 8-bit integer 16-bit integer 32-bit integer 32-bit floating-point 64-bit floating-point 8-bit unsigned integer 16-bit unsigned integer 32-bit unsigned integer 相应C语言类型 signed char short long float double unsigned char unsigned short unsigned long OpenGL类型 GLbyte GLshort GLint,GLsizei GLfloat,GLclampf GLdouble,GLclampd GLubyte,GLboolean GLushort GLuint,GLenum,GLbi tfield
绘制的样式
绘制的样式
OpenGLES不支持
OpenGL缺省坐标系
Y轴
屏幕
X轴
Z轴
顶点变换步骤
视图变换 gluLookAt 模型变换 glTranslatef glRotatef / glScale
透视矩阵 glFrustum/gluPerspective
视口变换 glViewort
顶点变换步骤
GLUT 库
GLUT封装了各平台图形界面和消息处理的细节,可以比较简洁的生成一 个应用
int main(int argc, char* argv[]) { glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | (GLUT_DOUBLE )); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("3dsplay"); glutDisplayFunc(myDisplay); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMouseFunc(mouse_cb); glutMotionFunc(drag_cb); glutMainLoop(); return(0); }
OpenGLES IOS Android PS3 Symbian DirectX3D Windows Xbox WinCE Windows Phone 7
OpenGL ES vs OpenGL
★ 去掉了多余的
API:
★ 去掉了多余的功

★ 对代价大的功能
做了限制
★ 去掉了一些数据
双缓冲
OpenGL不能做什么
直接绘制复杂模型
绘制阴影(需要间 接实现)
物理运动(需要物 理引擎)
火、烟等非实体物 质(使用粒子系统 间接实现)
模型文件,图片文 件的加载(使用其 它库)
系统消息,事件, 窗口系统的处理
硬件加速可以使用OpenGL的平台
OpenGL Linux Windows MacOS Unix WebGL
★ 精简了一些API
★ 去掉了对动态状
类型:
所支持的数据类型
态查询的功能
★ 没有GLU
OpenGL库函数
核心库(gl.h): 包含的函数有115个,它们是最 基本的函数,其前缀是gl 实用库(glu.h): 包含的函数功能更高一些,如 绘制复杂的曲线曲面、高级坐标变换、多边形 分割等,共有43个,前缀为glu。
OpenGL库函数
操作系统本地化库
GL
WGL GLX
AGL/CGL
GLU
GLUT
第三方工具包
通用GL窗口系统API
Window系统中的WGL函数定义
WinGDI.h <windows.h> // OpenGL wgl prototypes WINGDIAPI BOOL WINAPI wglCopyContext(HGLRC, HGLRC, UINT); WINGDIAPI HGLRC WINAPI wglCreateContext(HDC); WINGDIAPI HGLRC WINAPI wglCreateLayerContext(HDC, int); WINGDIAPI BOOL WINAPI wglDeleteContext(HGLRC); WINGDIAPI HGLRC WINAPI wglGetCurrentContext(VOID); WINGDIAPI HDC WINAPI wglGetCurrentDC(VOID); WINGDIAPI PROC WINAPI wglGetProcAddress(LPCSTR); WINGDIAPI BOOL WINAPI wglMakeCurrent(HDC, HGLRC); WINGDIAPI BOOL WINAPI wglShareLists(HGLRC, HGLRC); WINGDIAPI BOOL WINAPI wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD); WINGDIAPI BOOL WINAPI wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD); #ifdef UNICODE #define wglUseFontBitmaps wglUseFontBitmapsW #else #define wglUseFontBitmaps wglUseFontBitmapsA #endif // !UNICODE WINGDIAPI BOOL WINAPI SwapBuffers(HDC);
设定纹理属性参数
贴图步骤2 加载图片数据
加载贴图数据到纹理
选择缺省纹理
glBindTexture(GL10.GL_TEXTURE_2D, id);
加载位图数据 定义当前纹理
贴图步骤3 绘制
提供纹理坐标数组 设置当前纹理id 绘制
作业
相关文档
最新文档