OpenGLES2.0基础(4)

来源:互联网 发布:网络成瘾的原因和影响 编辑:程序博客网 时间:2024/06/06 04:28

> opengl着色模型与渲染模型

opengl学习笔记之指定着色模型- http://blog.csdn.net/my_lord_/article/details/55253299

openGL着色模型与渲染模型:
  在OpenGL中,API接受所有的透视投影和几何变换,并且将多边形光栅化,并且为每个多边形绘制正确的像素点。除此之外,我们的架构提供了用户界面和鼠标控制摄像机。

  在OpenGL固定渲染管线中,Phong局部光照模型可以通过以下代码定义:
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);//漫反射
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, diffuse);//环境光
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);//镜面反射光
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &glexponent);//镜面反射指数

  在默认情况下,OpenGL会计算两点顶点之间的其它点,并为它们填上“合适”的颜色,使相邻的点的颜色值都比较接近。如果使用的是RGB模式,看起来就具有渐变的效果。如果是使用颜色索引模式,则其相邻点的索引值是接近的,如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但如果颜色表中接近的项颜色却差距很大,则看起来可能是很奇怪的效果。
  使用glShadeModel函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某一个点相同。(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了避免这个不确定性,尽量在多边形中使用同一种颜色。
glShadeModel的使用方法:
glShadeModel(GL_SMOOTH); // 平滑方式,这也是默认方式
glShadeModel(GL_FLAT);   // 单色方式

可以通过glFrontFace函数来交换“正面”和“反面”的概念:
glFrontFace(GL_CCW);  // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW);   // 设置CW方向为“正面”,CW即ClockWise,顺时针

  OpenGL的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader Model5。
  OpenGL的顶点着色器取代了固定渲染管线的转换、光照、纹理坐标生成和转换;片断着色器取代了纹理、颜色求和和雾的操作。在OpenGL3.2版本中加入了几何着色器(GeometryShader)这个概念,在OpenGL4.0中又添加了分格化控制(Tessellation Control)和分格化评估(Tessellation Evaluation)着色器,最新的OpenGL版本4.3则添加了计算着色器(Compute Shader)。
  漫反射光照是一种简单的光照模型,它只考虑漫反射。镜面反射光照模型。

对斯坦福模型ply文件渲染的,ply模型资源有限,
其它三维模型,发现Obj模型网上有丰富的资源,且表达能力更强,但解析其就相对来讲复杂一些

CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率- https://github.com/bitzhuwei/CSharpGL
加载模型的obj模型加载的库- https://github.com/syoyo/tinyobjloader
加载模型的Assimp加载库- http://assimp.sourceforge.net/lib_html/index.html

  在3d图形处理中,一个模型(model)通常由一个或者多个Mesh(网格)组成,一个Mesh是可绘制的独立实体。例如复杂的人物模型,可以分别划分为头部,四肢,服饰,武器等各个部分来建模,这些Mesh组合在一起最终形成人物模型。
  Mesh由顶点、边、面Faces组成的,它包含绘制所需的数据,例如顶点位置、纹理坐标、法向量,材质属性等内容,它是OpenGL用来绘制的最小实体。

  模型一般通过3d建模软件,例如Blender, 3DS Max 或者 Maya等工具建模,导出时的数据格式变化较大,我们导入模型到OpenGL的任务就是:将一种模型数据文件表示的模型,转换为OpenGL可以利用的数据。例如上面的Obj文件中,我们需要解析顶点位置,纹理坐标等数据,构成OpenGL可以渲染的Mesh对象。

> OpenGL深度缓存
【颜色缓冲区】
  颜色缓冲区(COLOR_BUFFER)就是帧缓冲区(FRAME_BUFFER),你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示.
【深度缓冲区】
  深度缓冲区(DEPTH_BUFFER)与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确.
【模板缓冲区】
  模版缓冲(STENCIL_BUFFER)与深度缓冲大小相同,通过设置模版缓冲每个像素的值,我们可以指定在渲染的时候只渲染某些像素,从而可以达到一些特殊的效果.

1、深度
 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离。摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机。
2、深度缓冲区
 深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
 为了启动深度缓冲区,必须先启动它,即glEnable(GL_DEPTH_TEST)。每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体。
 为了实现深度缓冲,在整个屏幕空间上的对当前多边形顶点之间进行插值来计算 z' 的值,通常这些中间数值在深度缓冲区中用定点数格式保存。距离近距 near 平面越近,z' 值越密;距离越远,z' 值越稀。这样距离照相机越近精度越高。near 平面距离照相机越近,则远距离位置的精度越低。near 平面距离照相机太近是在远距离物体产生人为误差的一个常见因素。
3、深度测试
 OpenGL中的深度测试是采用深度缓存器算法,消除场景中的不可见面。在默认情况下,深度缓存中深度值的范围在0.0到1.0之间,这个范围值可以通过函数:glDepthRange (nearNormDepth, farNormalDepth);

  一般地,z轴的坐标原点在屏幕上,屏幕里为负轴,向外为正轴。我们通过眼睛可以看井的里面,那么在OpenGL中眼睛描述为摄像机。一般地,摄像机的初始位置在OpenGL窗口的正中心。

glClearDepth(1.0f); // 设置深度缓存    
glEnable(GL_DEPTH_TEST);    // 启用深度测试    
glDepthFunc(GL_LEQUAL);     // 深度测试类型 

  系统默认的参数为GL_LESS,这跟我们现实生活中一样,距离我视线的并且在同一直线上的事物,近的就会遮挡住远的。
GL_NEVER,不通过(输入的深度值不取代参考值)
GL_LESS,如果输入的深度值小于参考值,则通过
GL_EQUAL,如果输入的深度值等于参考值,则通过
GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过
GL_GREATER,如果输入的深度值大于参考值,则通过
GL_NOTEQUAL,如果输入的深度值不等于参考值,则通过
GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过
GL_ALWAYS,总是通过(输入的深度值取代参考值)
 但是可以使用glDepthFunc(func)来对这种默认测试方式进行修改。
 其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL (大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。一般来将,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。 

  绘制半透明物体时,需注意:在绘制半透明物体时前,还需要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了
  opengl中有一个非常有用的函数:glReadPixels(),可以读取各种缓冲区(深度、颜色,etc)的数值。要将opengl的绘制场景保存成图片,也需要使用这个函数。

------------------------------------------

> OpenGL剪裁算法
OpenGL编码剪裁算法Cohen-Surtherland算法- http://blog.csdn.net/u014004602/article/details/49619377
Sutherland-Hodgeman算法;OPENGL—参数裁剪(Liang-Barsky算法);codeblock;多边形裁剪;Cyrus-Beck裁剪算法
二维的裁剪,即一条二维的线段和一个方形的裁剪区域。
基于OpenGL的直线段的裁剪算法:C-S裁剪算法或L-B裁剪算法

> 走样和反走样技术  openGL 
OpenGL提供了诸如设置 GL_LINE_SMOOTH 属性、多重采样等线段反走样的方法,但效果和质量受到很多方面的限制,而且不同的硬件厂商使用不同的反走样算法

原创粉丝点击