前面那篇属于脑残篇,大家不要因此就小看了3D游戏,现在开始研究Graphics这个文件夹。

接口类跳过。

Model.cs/模型类

xnaModel

XNA里的模型类,比较支持.x的模型文件.

objectMatirx

之所以需要这个是因为3Dmax里的世界坐标系跟XNA里的世界坐标系不一样,需要沿x轴旋转45.

meshPart

模型中的一部分多边形模型,之所以这么区分是因为往往一个模型的不同部分具有不同的贴图.

Downscaling

模型缩放比.

Model构造函数

这里读取模型的代码是常用代码,基本流程为:创建一个Matirx数组transforms.将其与xnaModel进行绑定;获得模型的缩放比;根据这个缩放比计算objectMatirx.该函数代码解释将在以后补充.

Load函数

content中读取模型的具体代码,最后使用其数据创建RenderableMesh类对象,这个类是作者自己定义的.

Render函数

DistanceSquared变量

用于计算获得物体与屏幕的距离,大于20个单位的则不渲染。接着计算物体是否在摄像机的视线内。 如果没有被排除为不渲染mesh的话就可以将其加入renderableMesh的队列里进行渲染了。

 

Material.cs/材质类

DefaultSpecularPower变量

缺省反射强度。

DefaultParallaxAmount变量

缺省视差值。观测者在两个不同位置看同一天体的方向之差。比如,当你伸出一个手指放在眼前,先闭上右眼,用左眼看它;再闭上左眼,用右眼看它,会发现手指相对远方的物体的位置有了变化,这就是从不同角度去看同一点的视差。视差可用观测者的两个不同位置之间的距离(基线)在天体处的张角来表示。意义未明。

diffuseTexture 漫反射贴图

normalTexture 法线贴图

heightTexture 高度贴图

detailTexture 细节贴图

 

下面有个构造函数是通过传入effect特效文件产生的。对特效文件的介绍另外补充。

 

Texture.cs/贴图类

作者自己实现了一个贴图类,而不使用XNA自带的Texture类。这里用的贴图都是dds格式的,是被压缩过的一种图片,专门用于游戏。

precaledHalfPixelSize变量

像素一半的尺寸。用于在渲染到屏幕时校正贴图坐标。

internalXnaTexture变量

其实内部还是使用了一个Texture2D来帮助存储图像数据。

Load函数

这里句判断贴图是否有透明层的句子。Dxt5Dxt3都属于含透明层的贴图,所以只要对比一下Format属性就清楚了。

 

渲染方面调用了SpriteHelper方法,在稍后补充。重载了N多的绘制函数,先不急着一个一个看,大多都用不到,需要再反过来查。

 

AnimatedTexture.cs/动画贴图类

继承自Texture,可以放动画。

 

xnaTextures数组

储存动画每一帧的贴图。

 

 

SpriteHelper.cs/精灵帮助类

内有一个SpriteToRender

Render函数

通过传入的SpriteBatch画笔把图按照域值绘制在绘图纸上,一般指屏幕。

 

Sprites数组

存储所有要渲染的精灵图。

 

DrawSprites函数

调用这个函数一次性渲染所有图片。

 

TextureFont.cs/贴图字类

Remtexts数组

存储所有准备绘制到屏幕上的字符串。

 

WriteAll函数

一次性渲染所有的字符串。

 

LineManager2D.cs/2D线条管理类

 

BuildVertexBuffer 变量

标志线条队列里的元素是否被更改过了,被更改过后就需要刷新顶点缓存。

 

lineVertices数组

顶点缓存,储存所有的点的数据。

 

UpdateVertexBuffer函数

Lines里的数据写入顶点缓存lineVertices中。

 

AddLineWithShadow函数

产生带阴影的线条,其实就是在旁边画一条位置偏移一个像素的黑色线条。

 

之所以插入线条的操作不直接在顶点缓存中处理而要现在lines队列里处理再重写顶点缓存是因为顶点缓存只是一个普通的数组,不支持像链表一样的插入删除操作。

 

Rnder函数

其中绘制用到了ShaderEffect类里的函数,稍后补充。

 

LineManager3D.cs/3D线条类

2D线条类相似,只是2D线条类把Z分量赋值为0

 

MeshRenderManager.cs/网格渲染管理者

很重要的一个类。

其中有个子类RenderableMesh

其下的变量有:顶点缓存、索引缓存、材质、特效、顶点描述等渲染需要的素有参数。

 

RenderMesh函数

渲染这些网格的函数,必须在ShaderEffect.normalMapping方法里调用。意义未明。

 

                       BaseGame.Device.Vertices[0].SetSource(

                            vertexBuffer, streamOffset, vertexStride);

                       BaseGame.Device.Indices = indexBuffer;

 

将顶点缓存、索引缓存等数据赋值给显卡。

 

MatrixAndAlpha结构跟Parallax有关,具体作用未明。

 

MeshesPerMaterial

顾名思义,包含了一个贴图覆盖的所有网格。即可以把具有同样贴图的网格放在一起。

MeshesPerMaterialPerTechniques

把具有同样贴图和特效技术的网格放在一起。

 

Render函数

这玩意实在是复杂,等我把Shader那块看过来回过头来可能会比较容易理解。

 

TangentVertex.cs/切向量顶点类

Position 位置

Uv 贴图坐标

Normal 法向量

Tangent 切向量

这个类的作用仅仅是产生一个具有以上四个属性的顶点类。主要是特效渲染时传入顶点用。

 

LensFlare.cs/光晕效果类

通过控制七张贴图来模拟现实种的光晕效果,具体算法没仔细看。使用方法很简单,声明这样一个对象后(需传入位置参数),调用其render函数就行了。

 

 

posted on 2009-04-09 22:10  中大信息中心数媒部  阅读(339)  评论(0)    收藏  举报