我正在尝试使用 XNA 进行 3D 开发,但我有一个看似简单的查询,但我似乎无法找到答案。
我们有顶点着色器,如果我理解正确的话,它是用来转换顶点的。但是,我在 Matrix 类中也有各种方法,例如CreateRotationY
等,它们似乎做同样的事情。
我应该用什么来转换我的顶点?顶点着色器或矩阵内部的方法?两者之间有什么区别吗?
Matrix 类中的各种方法,例如 CreateRotationY 等,它们似乎做同样的事情
当您使用 时Matrix.CreateRotationY()
,您实际上并没有转换任何顶点。您正在创建(计算)一个矩阵,该矩阵最终将被发送到顶点将被它转换的着色器。
因此,即使您在 C# 中使用 Matrix 方法,顶点变换的繁重工作也始终在着色器中完成。将这两个选项(Xna 与 HLSL 中的矩阵方法)视为实现同一目标的两种独立方法是没有意义的。它们都代表了难题的不同且必要的部分。
顶点着色器在 GPU 上运行,您所说的矩阵用于使用 CPU 对 RAM 中的对象进行操作。
我应该用什么来转换我的顶点?
这取决于。
顶点着色器非常快,因为它们在 GPU 上运行,因此通过运行一些惊人的效果,您可以释放 CPU 来做其他事情,并将所有工作负载都放在 GPU 上,GPU 的架构专门针对矩阵和矢量运算进行了专门设计。
在 CPU 上,使用矩阵你可以做小而短的不太(“非常”是相对于你的程序性能问题的概念)计算密集型操作,因为将计算移动到 GPU,有它的成本。但这一切都取决于您的应用程序在做什么,因此您必须进行衡量。
一般来说,他们建议尽可能使用着色器进行快速计算。