顶点数据和Shader的绑定:有16种类型,编号为0-15.预定义类型一般为GLT_ATTRIBUTE_VERTEX...(GLT_ATTRIBUTE_XXX)
Uniform的设置:GLShaderManager::UseStockShader(GLenum shader,....)
后面带的参数就是shader需要的uniform
5、基于GLTools的图元绘制
使用GLTools中的GLBatch类可以进行图元的绘制,绘制前需要指定绘制的图元类型,顶点数和顶点数据
GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0)
可选的Private包括GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN.
需要特别解释的是GL_LINE_STRIP和GL_LINE_LOOP,一个是线带,一个是线环,一个没有闭合一个有闭合
GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN,一个是三角带,一个是三角扇,后者可以连成扇形甚至是圆形
通过CopyXXXData复制顶点各种属性数据之后,调用指定的着色器,调用Batch.Draw便可以绘制图元
6、背面剔除和深度缓冲
1、不开启背面剔除和深度测试的情况下,出现三角形重叠的时候,很难分出哪些三角形应该在前面哪些在后面,绘制顺序一团糟
2、一种优化的测试方法:先渲染远的三角形再渲染近的三角形。
缺点:需要对所有三角形进行排序,消耗大,而且重叠的像素需要进行两次写操作,在存储中进行写操作会是速度变慢
3、开启背面剔除:glEnable(GL_CULL_FACE)默认剔除背面,可以通过glCullFace(mode)来修改剔除正面还是背面。
优点:在渲染的图元装配阶段就抛弃一些三角形,提高性能
缺点:当发生自身重叠的情况,正常的渲染顺序还是会被打乱
注:当我们旋转的时候,原来的背面会变成正面,正面会变成正面,这应该是通过跟摄像机的法线判断来确定三角形的正反面的,也就是说不是一定顺时针环绕的背面永远看不到。()
4、开启深度测试:glEnable(GL_DEPTH_TEST)开启深度测试,当然在开启之前,应该初始化一个深度缓冲区glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
优点:深度测试将消除那些应该被以存在的像素覆盖的像素,解决背面剔除的问题
缺点:需要更多的内存开销
7、描边的效果:
开启深度测试之后,如果要描边或做贴花的效果,可能会出现Z轴冲突的现象,通过多边形偏移可以解决这个问题
glPolygonOffset(-1.0f,-1.0f)
glEnable(GL_POLYGON_OFFSET_LINE)
8、裁剪:确定最终渲染到窗口的视口大小
开启:glEnable(GL_SCISSOR_TEST)
设置:glScissor(x,y,width,height)
9、混合:Alpha显示以及抗齿锯支持的条件,只有开启混合才会有半透明和抗齿锯的效果
开启:glEnable(GL_BLEND)
常用的颜色混合:glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA):源颜色与自己身的alpha相乘,加上目标颜色乘以1-源颜色的Alplha。源颜色的Alpha越高,添加的源颜色成分就越多,目标颜色保留的成分就越少
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25410-2.html
让人匪夷所思