前面那篇属于脑残篇,大家不要因此就小看了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函数
这里句判断贴图是否有透明层的句子。Dxt5和Dxt3都属于含透明层的贴图,所以只要对比一下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函数就行了。
浙公网安备 33010602011771号