本文共 7113 字,大约阅读时间需要 23 分钟。
图片:image1.png
图片:image2.png
该阶段之后,像素的颜色值被写入帧缓存中。
学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解。
渲染(rendering):计算机根据模型(model)创建图像的过程。 模型(model):根据几何图元创建的物体(object)。 几何图元:包括点、直线和多边形等,它是通过顶点(vertex)指定的。
最终完成了渲染的图像是由在屏幕上绘制的像素组成的。在内存中,和像素有关的信息(如像素的颜色)组织成位平面的形式,位平面是一块内存区域,保存了屏幕上每个像素的一个位的信息。例如,它指定了一个特定像素的颜色中红色成分的强度。位平面又可以组织成帧缓冲区(framebuffer)的形式,后者保存了图形硬件为了控制屏幕上所有像素的颜色和强度所需要的全部信息。
理清了基本的概念,下面了解了一些关于OpenGL渲染管线的知识.看了这个之后对于OpenGL的学习我想应当是很有帮助.关于这么一篇的原文则是GLSL-LIGHTSOURCE 教程一个开篇部分.点击这里。原文是英文的,以下是中文的翻译,点击访问下文的。
关于渲染管线将什么呢?无非就是在OpenGL的管道当中各个部分的功能以及如何在管道当中形成了我们想要的最终的一幅图.(像素).而管线当中的操作可分为以下几个部分:
如:点 线 三角形.等一些几何图元..OpenGL绘制几何图元的方法有以下三种:
上面这两种模式则是立即模式.即指定完图元之后会被立即渲染.即将所有数据发往渲染管线后立即被渲染.
不管以上的几何对象是如何指定的,所有的几何数据都将会经过这个阶段,这个阶段负责的则是逐个顶点的操作.
在这个阶段能做的工作则是:
而最重要的则是变换以及光照. 每个顶点在这个阶段分别是单独处理的.
这个阶段所接收到的数据则是每个顶点的属性特征..输出则是变换后的顶点数据.
在顶点处理之后,顶点的全部属性都已经被确定。在这个阶段顶点将会根据应用程序送往的图元规则如GL_POINTS 、GL_TRIANGLES 等将会被组装成图元。
这些操作将会最后影响其在帧缓冲区的颜色值.
glColorMask、glStrncilMask、glDepthMask、glClearDepht、glClearStencil、glClearColor 等.将在这个阶段影响写入的值.
以上只是讨论OpenGL 图元绘制的基本过程 那么基于像素图像绘制.几乎形同之上..只是在光栅化处理前的操作不一样.即经过像素解码 像素传输.栅格化 最后形成片元...片元之后的处理完全一样..
在着色器编程领域..你将可实现
因为这三个阶段所决定都是最重要效果的阶段..对于这些的可编程将带来非常大的好处以及可控制的渲染!!
在前面的固定功能管线提到了,在阶段5:栅格化操作 过程中, 片元的属性会由图元上顶点数据等经过插值而确定。在顶点着色器处理完毕后,OpenGL都会将顶点与顶点之间的片元(基本上可以理解为像素)的属性(如位置坐标、纹理坐标)进行线性插值。所以,在纹理坐标为(1,0)和(0,0)中间的片元会得到一个(0.5,0)的纹理坐标,在纹理坐标为(0,0)和(1,1)之间的片元会得到一个(0.5,0.5)的纹理坐标。然后将这些经过差值处理之后的片元交给片元着色器处理。片元着色器确定最终的片元颜色。
-----------------------------------------------------------------------------------------------------------------------------
渲染管线过程:
3D 物体经过一系列的变化(过程),最终显示在玩家的眼帘的过程。
3d(面片),3D Object ,经过一系列复杂的过程,这个过程硬件变化是看不到的
输入的是一个面片,输出的是一个形状
贴图:要分uv,要对uv做纹理坐标的映射。
拿到美术资源,有贴图,是错觉 ,美术为了便于设计,在制作时候是有贴图,分uv,及映射,
提交给引擎是图片和模型是分离的,还有一个材质球是索引所有图片的,材质球里面带有参数。
黑盒里面包含的步骤:
顶点处理:
通过一系列的坐标系转换,讲模型的顶点在摄像机前进行位移,并最终投影到摄像机的投影屏幕上。
本地坐标
世界坐标
观察坐标
投影坐标
本地--世界
将每个物体模型的位置从以自己为中心的坐标系,摆放到整体游戏世界的具体某一个位置中
到世界坐标系后才能形成一个场景。
世界--观察
将每个物体模型的位置以世界为参照系,转换到以观察者为参考系。
观察--投影
将每个物体模型的位置从观察者所在的坐标体系中,转到观察者投影平面上
最特殊的一次坐标系转换(非线性,模型倍扭曲)
光照: 在观察坐标系下进行。 (观察可以从不同的角度去观察object)
-------------------------------------------------------------------------------------------------
面处理:通常有引擎来处理
面的组装
point list Triangle List Line List Triangle strip Line strip Triangle Fan
面截取
面剔除
U3D Shader可以设置
HRESULT SetRenderState(D3DRS_CULLMODE,value)
可选择的值有:
D3DCULL_NONE:对任何顶点排列方式都不进行剔除
D3DCULL_CW: 顺时针排列的顶点被认为是反面,对他们进行剔除
D3DCULL_CCW: 逆时针排列的顶点被认为是反面,对他们进行剔除
注:正反面是根据法线
视锥剔除:去掉在视锥外的面的部分
在截取过程中,落在屏幕外面的面的部分已经被去除,视锥剔除阶段主要处理落
在近端截除平面和远端截除平面之外的面的部分。
解决方式:通过硬件提供的深度缓存Depth Buffer或者z-Buffer来判读。
这里的深度指面距离镜头所在平面的距离。
-------------------------------------------------------------------------------------------------
光栅化
像素处理
本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366137,如需转载请自行联系原作者