摘要:
问题 三角形的最主要问题是它是平的。如果你使用两个三角形绘制一堵巨大的墙并在墙上附上一个漂亮的纹理,结果是令人失望的平的。 你可以将三角形分割成更小的三角形以添加细节,这需要定义每个顶点的3D位置,但这样做会消耗太多的资源。 解决方案 你可以使用凹凸映射代替上述这个丑陋的方法。凹凸映射通过改变三角形每个像素的颜色给观察者留下三角形表面高低起伏的印象。 如果你看一张平整的红色的塑料板的图片...
阅读全文
posted @ 2011-02-14 13:59
AlexCheng
阅读(613)
推荐(0)
摘要:
问题 顶点用来存储从XNA项目发送到显卡的数据。一个顶点格式包含存储在顶点中的数据的描述。XNA框架自带有默认的顶点格式,从简单的VertexPositionColor到 VertexPostionNormalTexture格式。 但是,如果你需要顶点带有额外的数据,例如切线或时间数据,就需要定义自己的顶点格式。如果要在顶点shader中使用这个数据,这一步是必须的。所以,只有编写自定义的顶点...
阅读全文
posted @ 2011-02-14 13:52
AlexCheng
阅读(594)
推荐(0)
摘要:
问题 你想从一个XML文件中加载数据到XNA项目。你可以使用默认的.NET文件IO功能在XNA项目启动时读取文件做到这点,但这在Xbox360平台上无法工作。 你想使用内容管道将一个XML文件串行化为一个二进制文件,这样就可以在XNA项目中读取包含在这些文件中的内容了。 解决方案 在XML文件中,只需简单地将你想要加载的对象插入到和标签之间,下面的XML示例文件是一个自定义的MapData...
阅读全文
posted @ 2011-02-14 13:49
AlexCheng
阅读(567)
推荐(0)
摘要:
问题 你想获取地形上由光标指示的位置的精确3D坐标。 解决方案 如教程4-19的介绍中讨论的那样,通过光标指示的屏幕上的一个2D点对应3D场景中的一条射线。在本教程中,我们将沿着这条射线直到它与地形发生碰撞。 你可以使用一个二分法搜索(binary search algorithm)做到这点,这可以根据你选择的精度获取碰撞位置。 对高低起伏的地形来说,可能在射线和地形之间有多个碰撞点,如...
阅读全文
posted @ 2011-02-09 09:12
AlexCheng
阅读(348)
推荐(0)
摘要:
问题 当你制作一个使用地形的游戏时,你需要知道地形确定点的精确高度。例如,在地形上移动一个模型时(见教程4-17),当检测到光标和地形之间的碰撞时(下一个教程),或防止相机与地形碰撞时(见教程2-6)。 因为在前一个教程中你定义了地形每个顶点的3D位置,所以获取这些点的高度很简单。对位于这些顶点间的位置而言,你需要使用一种插值方法获取这个位置的精确高度。 解决方案 如果你想知道高度的点与地...
阅读全文
posted @ 2011-01-28 11:05
AlexCheng
阅读(1250)
推荐(0)
摘要:
问题 基于一张2D高度图,你想创建一个地形并以一个有效率的方法绘制它。 解决方案 首先需要一张高度图,包含所有用来定义地形的高度数据。这张高度图有确定数量的二维数据点,我们称之为地形的宽和高。 显然,如果你想基于这些数据创建一个地形,这个地形将从这些width*height顶点中绘制,如图5-14右上角所示(注意数字是从0开始的)。 图5-14 地形网格 要使用三角形完全覆盖网...
阅读全文
posted @ 2011-01-28 11:02
AlexCheng
阅读(1228)
推荐(0)
摘要:
问题 当绘制自定义的结构时,你会发现光照不正确。 这是因为你没有指定正确的法线向量,显卡要求每个顶点都有法线信息,这样它才可以决定每个三角形获得多少光照,详细信息可见第六章。 为每个顶点计算法线向量看起来很复杂,因为大多数顶点被多个三角形共享。 解决方案 如果每个顶点只被一个三角形使用,你只需找到三角形的法线向量(换句话说,这个向量垂直于三角形)并将这个向量作为三个顶点的法线向量。 但...
阅读全文
posted @ 2011-01-28 10:58
AlexCheng
阅读(899)
推荐(0)
摘要:
问题 在前面的教程中,你经常可以在Draw方法中看到以下代码: device.RenderState.CullMode = CullMode.None; 如果你移除这行代码并将相机移动到三角形的后面,它们会消失!当你在没有理解backface culling时定义三角形顶点,会有50%可能三角形无法显示。 解决方案 你定义三角形顶点的方式告知XNA你想让哪一面朝向相机。 当绘制一个实...
阅读全文
posted @ 2011-01-26 10:51
AlexCheng
阅读(3459)
推荐(0)
摘要:
问题 你需要频繁更新顶点数据,如果使用VertexBuffer的SetData方法会拖慢程序。 解决方案 如果你计划频繁更新顶点数据,应该使用DynamicVertexBuffer而不是VertexBuffer。 这会让数据不是存储在最快的显存中,而是更容易处理的某些内存中。所以,这样做会让性能有一点降低,但在VertexBuffer中频繁地改变数据会让性能得到极大地提高。 对于Ver...
阅读全文
posted @ 2011-01-26 10:47
AlexCheng
阅读(1496)
推荐(0)
摘要:
问题 每次当你调用device. DrawUserPrimitives方法时,顶点都会从系统内存传递到显卡中。通常,大部分数据没有变化,这意味着每帧重复传递了相同的数据。今天的显卡有容量很大而且很快的显存,所以你可以将顶点数据存储在显存中加速程序。从显存中将顶点数据传递到显卡速度要快得多,因为这些数据只在同一板卡的不同芯片间传输。同样索引数据也能获得加速。 解决方案 通过创建顶点数组的Ver...
阅读全文
posted @ 2011-01-25 09:20
AlexCheng
阅读(657)
推荐(1)