3D流水线[引用]
初步涉及3D,被高手指出对D3D的硬件流水线不熟悉.马上找资料,并做总结.我可不能落后哎.
先发张流水线的图:
一.system memory(系统内存)
3D数据被CPU创建后,在进入流水线之前,会储存在系统内存中.之后,这些待决数据将通过数据总线传入显卡的AGP存储器或显存中.
二.1.vertex data(顶点数据)
点是最基本的几何图元,一个三角形由三个顶点组成,一个矩形有四个。
D3D中定义的顶点不只包含位置信息,还可以加入好多其他的要素.举个例子
typedef struct vertex
{
FLOAT x,y,z;
FLOAT u,v;
DWORD color;
}COSTUMVERTEX;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEXT1)
这段代码就表示所定义的顶点包含位置,漫反射,纹理坐标的信息.这种形式称为FVF(Flexible Vertex Function)可变顶点格式.这些顶点数据会继续送入流水线下一级进行平移,旋转,光照,着色处理.
2.Surface Data(页面数据)
这是个啥东西以前还真没搞明白过,一直理解为2D中的surface,在D3D9SDK中,ddraw被去掉了,据说是运用3D流水线进行2D编程将比传统的2D流水线更高效><,今天算是碰到它了,借此机会一蹴而就!
Andre的书上说,这种surface被称为high-order-surface,不是在CPU里创建的,使用的也不是自己定义的那个顶点格式,而是由一些数学函数直接在显卡里创建的,作用能够使网格模型更加平滑,还提到两个技术术语,一个N-Patches(貌似以前在哪见过...)和
TRUFORM meshes on ATI hardware(从没听说过,从字面上理解应该是ATI显卡特有的技术).完了,貌似有点深奥,时间紧迫,还是先放这儿了.....
三.1.Transform and Lighting(移动和光照)
这部分作用就是让顶点组成的物体能够在虚拟世界中产生位移产生旋转以及进行光照计算,不然,整个世界不都黑忽忽的,不生动啊,不真实啊,现在人不都讲究个真实和诚信嘛!
移动是用变换矩阵实现的,让组成物体的每个顶点乘上那个变换矩阵就OKAY了。光照稍微复杂一点,按光源分类有点光源(point light),平行光(directional),探照灯(spot light);按照性质有自发光(emisive),环境光(ambient),镜面反射(specular),漫反射(diffuse).在虚拟的环境中,这些光考虑的越周全,表现出的效果也就越真实,但渲染速度也会变慢的。
2.Vertex Shader(顶点着色)
分为flat着色和Gouraud着色,各有利弊吧.说的细点,flat着色是根据组成物体每个面的法线进行着色,做出的效果不平滑,如果对一个球体运用flat的话,效果会是disco舞厅天花板上的那个球装灯的样子.Gouraud着色根据各顶点的法线来计算插植进行着色,得到的效果要平滑的多。
flat
Gouraud+specular
还可以不用微软的API,自己用HLSL做算法,那个就太难了....(HIGH LEVEL SHADING LANGUAGE)
四.clipping(裁减)
这部很关键哦,能够有效减少GPU的运算量.在虚拟世界中,我们得到的是角都是有限的,就像在现实世界,人不可能看到身后的东西,除非后面长眼了,还有,太远的物体看不到,比如,美国人看不到本拉登在做什么,所以他们急啊,他们想找到那老头子....,太近了更看不到了,看到了可麻烦了,如果每个人都能看到细菌,那还吃饭吗?所以,在光栅化之前,要把理论上看不到的东西裁减掉,别让GPU运算,那没用啊。
五.1.MutiTexture(多重纹理)
人靠衣服妆吧,总不能光着身子上大街,那也不好看啊。在虚拟世界里也一样,单单一个网格模型只不过是个骨架子,看上面那两个球就知道,很生硬吧.如果能加上纹理就会有生动的效果了哦。现在的显卡都能支持好多重纹理了,具体多少我也不清楚,十几层吧,你可以做个人物模型,先贴上皮肤,再贴上内衣内裤,再贴上秋衣秋库,再贴上毛衣毛库.....
2.Pixel Shader(象素着色)
就是产生象素级别的颜色控制,做的好的话能够使模型展现一流的效果,更加平滑,更加真实.比如柔顺的绣发,光滑富有质感的皮肤.....,API里目前我还不知道有啥,HLSL肯定能做.
六 FOG(雾化效果)
想要朦胧感?雾化一下吧,参考PS上的寂静岭1......那个终年被浓雾笼罩的小镇.
七.stencil/depth/alpha test(色深,深度,啊而法测试)
在将"渲"好的世界投影在屏幕之前还是做下物体遮挡测试,现实中肯定不会有人拥有透视眼吧,能看到墙后面的物体,那可绝了!那穿衣服也没啥用了....
stencil和depth我还没分太清楚,好象都是进行物体的象素对比.depth可以用z-buffer或w-buffer运算,stencil还不清楚,先放这儿了.alpha是标识物体透明度的,比如,水总是透明的吧,丝绸也有透明的吧.玻璃总透明吧.....
八.frame buffer
一切的一切都准备好了,送入帧缓冲,准备把美丽的3D世界投影到屏幕上吧^^
我最擅长从零开始创造世界,所以从来不怕失败,它最多也就让我一无所有。