您的位置:首页 > 运维架构

Opengl渲染管线 坐标变换 纹理与光照

2015-03-14 15:10 183 查看
转载与个人总结

1.Opengl渲染管线



Opengl实现顺序都差不多,这些差不多的处理过程叫做Opengl的渲染管线。了解渲染管线有助于理解Opengl是怎么实现的,主要对几何数据和像素数据进行操作。

大概是这样:



2.Opengl坐标变换

世界坐标:无论如何变换,世界坐标系都不动,以屏幕中心为原点(0, 0, 0),你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。

当前坐标:当前坐标是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前坐标系是重合的,当用变换函数做移动和旋转时,都是改变的当前坐标,改变的位置都是当前坐标相对自己的x,y,z轴所做的改变,改变以后,再绘图时,都是在当坐标进行绘图,所有的函数参数也都是相对当前坐标来讲的。

裁剪区域:占据窗口的的笛卡尔空间区域,只有在裁剪区域内的物体才可见。

视口:裁剪区域的宽度和高度很少能够正好与窗口的宽度和高度(以像素为单位)相匹配,因此,坐标系必须从逻辑笛卡尔坐标映射到物理屏幕坐标,这个映射是通过视口的设置来指定的。视口就是窗口内部用于绘制裁剪区域的区域。

屏幕坐标:Windows屏幕坐标以左上角为原点,X轴正方向朝右,Y轴正方向朝下。Windows屏幕坐标和虚拟3D世界坐标不是简单映射的, 这个过程很复杂.我们只有将鼠标的热点的坐标通过Windows坐标到3D屏幕坐标逆转换后,才能得到在3D世界的对应点。
3.Opengl纹理

纹理就是用图像给图元贴图。所以纹理对象也就是一个图像,Opengl中用一个纹理编号绑定一个纹理对象。

纹理贴图能够保证,映射的纹理能够在图元变化时也表现出正确的行为(就是一直正确的贴着呗)。

纹理不仅仅是二维的!可以是一维的(为点贴,虽然没什么意义),三维的(比如球面贴图)。

步骤:

1.创建纹理对象并绑定图片

2.确定纹理如何应用到每个像素:就是指->纹理图像的颜色+条件(没有即直接用纹理图像颜色)=确定像素显示的颜色

3.执行纹理贴图功能(一维、二维、三维或立方图纹理)

4.绘制场景,提供纹理坐标和几何坐标:个人理解(基于二维)



4.Opengl光照

眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。

Opengl在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。

光源:Opengl支持有限数量的光源(至少8个,开启过多的光源将会导致程序运行速度的严重下降)。光源有反射特性(可设置漫反射后,镜面反射后及多次反射后最终的光的强度),位置属性(x,y,z,w   x/w,y/w,z/w  w为0表示该比例的无限远的点是方向性光源,w不为0为位置性光源,位置性光源还具有聚光灯,沿直线传播递减等特性)。

材质:受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(不考虑折射),材质特点就决定了物体反射光线的特点。材质有反射特性(可设置漫反射后,镜面反射后及多次反射后最终的光的颜色),镜面指数(材质的粗糙-光滑程度,影响光的反射),本身发出的光(假定材质本身发出一定的微弱的光线,使效果逼真)。

光照环境:将影响光照的一些参数。比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

法向量:知道光源及入射角就能推出反射光线,进而计算出光照效果。在Opengl中,不会自动计算每个顶点法向量,需要逐个顶点一一指定(但顶点之间的点的法向量会自动计算)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: