标签:
1、渲染中的双缓冲:
使用但缓冲的时候,在渲染每一帧的绘图时,会对画板进行擦除然后在慢慢填充绘制,如果绘制时间过长的时候,就会出现闪烁的现象。为解决这个问题,所以引入双缓冲
双缓冲相当于,在显示的画板中重新创建另外一个画板,绘制的过程在另外的画板进行,绘制完成之后,将显示的画板的内容直接替换成另外一个画板的内容。这样呈现的过程中就不会出现闪烁的问题,即使是绘制的过程比较慢,最多就是出现顿的现象
在例子中渲染的RenderScene()函数中,每次渲染结束之后都会调用glutSwapBuffers()进行缓冲区的切换渲染
void RenderScene(){ glClearColor(0.0f, 0.0f, 1.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glClearColor(1.0f,0.0f,0.0f,0.0f); glScissor(100,100,600,400); glEnable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0f,1.0f,0.0f,0.0f); glScissor(200,200,400,200); glClear(GL_COLOR_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glutSwapBuffers(); }
2、绘制过程:
图元最终的呈现其实是通过一个管线的过程,呈现一个图元,我们必定需要顶点数据,而且需要最终填充成像素的着色器。通过这两个着色器渲染成最终像素的过程就是图形的管线。
OpenGL2.0之后使用可编程的管线,也就是渲染图元的时候,我们是需要通过shader程序进行的,一般会分成两个过程,一个是顶点着色器的处理,一个是片段着色器的处理。
顶点着色器处理客户机输入的数据,应用变换,数学计算(光照,颜色,位移),逐顶点处理
片段着色器会输出我们最终在屏幕看到的像素颜色,逐像素处理。
Shader的数据传递:顶点属性数据,uniform数据,纹理数据
顶点数据:顶点位置,顶点颜色,纹理坐标,光照法线。这些数据一般都是传入顶点着色器进行处理的。
uniform数据:和属性数据不同的是,片段着色器中也可以有Uniform变量。Uniform变量在改变的时候是逐批次的不是逐顶点的。常用于设置变换矩阵
纹理数据:纹理数据提供给片段着色器进行采样,根据纹理坐标应用于图元的像素中
输出变量:可以将顶点着色器的传递到片段着色器中
3、坐标系和投影
GLFrustum:使用该类作为投影矩阵的容器
正投影:通过调用GlFrustum::SetOrthographic(xMin,xMax,yMin,yMax,zMin,zMax)的函数来对最终绘制的图像进行投影。opengl超级宝典该投影一般用于2D绘图。opengl超级宝典
透视投影:通过调用GLFrustum::SetPerspective(fFov,fAspect,fNear,fFar)的函数来获取一个投影矩阵。
fFov:在垂直方向上的视觉角度
fAspect:窗口宽高的纵横比
fNear:近裁剪面的距离
fFar:远裁剪面的距离
4、一套现成封装好的Shader管理器
我们使用GLTools中的GLShaderManager进行进行渲染。自带了很多预定义的Shader。
在使用之前必须先 初始化:shaderManager.InitializeStockShaders()
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-36950-1.html
再横起来也不迟
小王子