我是directx的新手,但令我感到惊讶的是,我看到世界矩阵和视图矩阵的大多数示例都是顶点着色器的一部分,而不是乘以CPU并将结果传递给着色器。
对于刚性对象,这意味着对于对象的每个单个顶点,将相同的两个矩阵相乘一次。我知道GPU可以在多个顶点上并行执行此操作(实际上并不知道有多少顶点),但这不是真的效率低下,还是我只是缺少某些东西?我仍然是新的,无能为力。
答案 0 :(得分:5)
通常,您希望在CPU上执行此操作。但是,DirectX 9具有“preshaders”的概念,这意味着这种乘法将在CPU上预先完成。对于较新的API,这已被删除,但它可能与您正在查看的示例非常相关。
此外,与内存访问相比,现代GPU在ALU操作方面非常快。具有适度复杂的顶点着色器(可能具有纹理提取)意味着进行矩阵乘法所需的数学是免费的,因此作者可能甚至没有打扰过。
无论如何,最佳做法是在CPU上预先乘以一切。同样适用于将像素着色器中的工作移动到顶点着色器中(如果某个东西在三角形上是恒定的,则不要按像素计算它。)
答案 1 :(得分:1)
嗯,这对我来说听起来一点儿都没有,你是绝对正确的!
我不确切知道你一直在看什么样的例子,但一般情况下你会尽可能多地传递预先计算的矩阵 ,这就像语义一样WORLDVIEW(甚至更适合简单着色器,WORLDVIEWPROJECTION) for 。
异常可能是着色器代码也需要访问单独的矩阵的情况(但即便如此,我通常也会传递组合矩阵)......或者也许那些所有关于说明矩阵乘法的例子。 : - )