摘要: 大多数函数已经重载以使其可以对所有内建类型有意义。例如,abs对所有数值类型有意义,所以它为所有这些数值类型进行了重载。又例如,叉积的叉乘仅对 3D向量有意义,所以它对所有类型的3D向量(比如:int,float,double的3D向量)进行了重载。另一方面,线性插值——lerp,对于数值、2D、3D和4D向量有意义,因此重载了这些类型。
阅读全文
摘要: HLSL有一个丰富的内建函数的集合,它们对3D图形来说非常有用。下表是一个删减了的列表,注意:要得到更多的参考,可以参看DirectX文档中内建HLSL函数的完整列表。
阅读全文
摘要: 为便于参考,这里给出一个HLSL定义的关键字列表:
阅读全文
摘要: HLSL支持下列数值类型(scalar type):
bool—True or false value. Note that HLSL provides the true and false keywords.
int—32bit signed integer
half—16bit floating-point number
float—32bit floating-point number
double—64bit floating-point number
注意:一些平台不支持int, half, and double类型,这时我们使用 float类型模拟。
阅读全文
摘要: 下一个方法就是设置常量的默认值,这些默认值在声明时初始化。这个方法应该在应用程序建立(setup)期间被调用一次 (called once)。
阅读全文
摘要: 每个着色器有一个常量表,用来保存它的变量。D3DX库通过ID3DXConstantTable接口,提供给应用程序访问着色器的常量表。通过这个接口我们能够在应用程序中设置着色器源代码中的变量。
我们现在描述ID3DXConstantTable接口的方法列表的实现,全部的列表请查阅Direct3D文档。
阅读全文
摘要: 在我们写的程序里顶点和像素是很小的对象,它们由GPU来执行,是固定功能管线的一部分。用我们自己写的着色器程序替换一部分固定功能管线,在绘制效果上我们获得很大的灵活性。我们不再局限于预定义的"固定"操作。
为了编写着色器程序,我们需要一种高级着色器语言(High-Level Shading Language ,简称HLSL) 。 在DirectX 8中,着色器是用低级着色器汇编语言编写的。幸运的是,我们不必再用汇编语言来写着色器了,DirectX 9支持一种高级着色器语言来写。
阅读全文
摘要: 假设用户点击了屏幕上的点 s (x, y)。 从图15.1我们能看到用户选取了茶壶。无论如何,应用程序无法根据给定的s点就立即确定茶壶是被选取。
我们知道一些知识:关于茶壶和它的关联点s,茶壶投影在围绕s点的区域,更准确的说是:它投影到投影窗口上围绕p点的区域,与它对应的屏幕点是s。因为这个问题依赖于3D物体与它的投影之间的关系,我们看图15.2就可以了解。
阅读全文
摘要: 许多自然现象是由很多小的小颗粒组成的,它们有相似的行为。(例如,雪花落下,闪烁的火焰,冲出枪管的“子弹”),粒子系统用来模拟这种现象。
粒子是一个很小的对象,它通常用来模拟数学中的一个点。点元是用来显示粒子的很好的方案,可是点元被光栅化成一个简单的像素。这没给我们多少灵活性,因为我们想有各种大小不同的粒子,并且把整个纹理平滑映射到这些粒子上。在Direct3D 8.0以前,因为点元方法的局限性而完全不使用他们。代替的方法是程序员将使用公告板去显示粒子,一个板是一个方格,世界矩阵用它来确定方向,使它总是朝向照相机。
阅读全文
摘要: 本例程实现了一个粒子枪系统,运行效果如图14.4所示:
阅读全文