01:基础了解
投影方式:正投影2D,透视投影3D
存储着色器分类:
单元着色器、平面着色器 、上着色器、默认光源着色器、点光源着色器、纹理替换矩阵着色器、纹理调整着色器、纹理光源着色器。
常见图元连接方式:
最受欢迎的是三角形
点GL_POINTS、线GL_LINE、线段GL_LINE_STRIP、线环GL_LINE_LOOP、三角形GL_TRIANGLES、三角形带GL_TRIANGLES_STRIP、三角形扇GL_TRIANGLES_FAN
三角形环绕方式:
OPenGL中默认具有逆时针环绕方向的多边形为正面,可修改。
三角形带的优势:
1:第一个三角形用了3个顶点之后,对于往后的三角形,每次只需再指定一个顶点,即可构成三角形。当需要绘制大量三角形时,一是可以复用,而是可以节省存储空间。
2:提高运算性能和节省宽带,更少的顶点使数据从内存传输到顶点着色器的速度更快,顶点着色器中顶点处理的次数也更少了。
了解OPenGL中的投影方式、存储着色器分类、常见图元连接方式 ==》详细参考这位美女:链接
02:案例,六边形,圆环,金字塔绘制
大体流程:
- main函数:程序入口
- ChangeSize函数:设置视口 投影方式
- SetupRC函数:图形数据配置,主要是顶点数据及图元连接方式
- RenderScene函数:主要用于图形的绘制,可以系统触发,也可以手动触发
- SpecialKeys函数:对特殊键位的回调处理
- KeyPressFunc函数:针对空格键的回调处理
- DrawWireFrameBatch函数:用于立体图形填充及边框绘制
PS:图片来自 Style_月月大神
图案绘制大体流程
主要函数解析
1:ChangeSize函数
主要用来设置视图大小以及当视口发生变化时调用的函数,本案例中立体图形的绘制,需要使用投影矩阵
因此需要在该函数中设置投影矩阵主要及以下步骤:
- 设置图形投影的方式:因为是立体图形,所以选择透视投影
//参数1:垂直方向上的视场角度
//参数2:视口纵横比 = w/h
//参数3:近裁剪面距离
//参数4:远裁剪面距离
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 500.0f);
- 通过设置的投影方式获得投影矩阵,并将其存入投影矩阵中
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
- 初始化模型视图矩阵堆栈,压入一个单元矩阵
modelViewMatrix.LoadIdentity();
2:SetupRC函数
从流程图上可以看出,除了基本的背景色设置,存储着色器初始化以及顶点数据的创建传输外,还需要对矩阵及观察者做一下设置。
- 将模型视图矩阵和投影矩阵放到变换管道中,变换管道的作用是能帮助快速进行矩阵想乘,在RendScene函数中可以直接通过变换管道的Get方法得到相应的矩阵。
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
其中,变换管道通过get可获得矩阵有4种
方法 | 说明 |
---|---|
GetProjectionMatrix() | 投影矩阵 |
GetNormalMatrix() | 法线矩阵 |
GetModelViewMatrix() | 模型视图矩阵,简称 mv |
GetModelViewProjectionMatrix() | 模型视图投影矩阵,简称 mvp |
设置观察者位置
cameraFrame.MoveForward(-15.0f);
观察者位置的设置有3种
方法 | 说明 |
---|---|
void MoveForward(float fDelta) | 向外移动的像素点,修改z |
void MoveUp(float fDelta) | 向上移动的像素点,修改y |
void MoveRight(float fDelta) | 向右移动的像素点,修改x |
3:RenderScene函数
其流程如下,主要是立体图形的渲染过程:
1:清理缓存区
2: 模型矩阵中push一个单元矩阵(目前栈中有两个单元矩阵,目的:在绘制完成图形后可以还原矩阵)
3:利用mCameraFrame构建观察者矩阵
4:栈顶单元矩阵观察者矩阵 = 新观察者矩阵,将新观察者矩阵压栈
5:利用mObjectFrame构建物体矩阵
6:栈顶观察者矩阵物体矩阵 = 模型视图矩阵,将模型视图矩阵压栈
7:设置存储着色器类型(平面着色器)
8:绘制图形 ——》 绘制完毕,还原矩阵(模型视图矩阵pop出栈)
这个过程是将物体坐标转化为裁剪坐标,然后经过OpenGL的处理,转换为NDC,并显示到屏幕上的一个过程。其栈变化如下
栈中变化过程
- ChangeSize函数中向栈中初始化了一个单元矩阵
- RenderScene函数中再次向栈中压入了一个单元矩阵:主要是为了图形绘制完成后,矩阵的复原,所以栈中有两个单元矩阵
modelViewMatrix.PushMatrix();
- 将cameraFrame构建为观察者矩阵,将栈顶单元矩阵取出,与观察者矩阵相乘,得到新的观察者矩阵,再将其入栈
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
- 将objectFrame构建为物体矩阵,取出栈顶的观察者矩阵,与物体矩阵相乘,得到模型视图矩阵,并将其入栈
- 然后利用固定管线渲染图形,在图像渲染后,将栈中模型视图矩阵pop,恢复其初始状态。
网友评论