6

基于以下资源,我一直在尝试在 GPU 上实现与分辨率无关的三次贝塞尔渲染:

GPU 宝石 3 第 25 章

曲线蓝调

使用可编程图形硬件的分辨率无关曲线渲染

但正如 Curvy Blues 网站所述,其他两个网站上的文件存在错误。Curvy Blues 让我查看评论,但我似乎无法找到这些评论。另一个论坛告诉我同样的情况,我不记得那个论坛是什么。但肯定有一些我想念的东西。

无论如何,我试图重新生成正在发生的事情,但我无法理解根据变换坐标组合的行列式计算判别式的部分。

所以我有原始坐标,我把它们放在一个 4x4 矩阵中,用 M3 矩阵变换这个矩阵并得到 C 矩阵。然后我从 C 矩阵中的坐标创建 3x3 矩阵并计算行列式,然后可以将它们组合以创建有助于我找到根的二次方程的 a、b 和 c。

问题是,当我完全这样做时:判别式不正确。我清楚地输入了蛇纹石的坐标(对称的,但正确的蛇纹石),但它说它是一个尖点。当我使用 wxMaxima 自己计算它,推导一阶和二阶,然后计算叉积,简化为二次方程时,当我输入相同的坐标时,该方程的判别式似乎是正确的。当我强制代码使用我自己的判别式来确定它是否是蛇形时,但我使用行列式来计算进一步的 k,l,m 纹理坐标,结果也是不正确的。所以我认为行列式中一定有错误。

谁能帮我解决这个问题?

4

2 回答 2

2

我想我已经设法解决了。结果接近完美(有时是倒置的,但这可能是一个不同的问题)。

这就是我出错的地方,我希望我能帮助其他人不要浪费我一直在浪费时间寻找这个。

我的代码基于 blinn-phong 文档。我有坐标 b0、b1、b2、b3。我曾经用 aw 将它们视为 2D 坐标,但我改变了这个视图,这解决了问题。通过将它们视为 z = 0 的 3D 坐标,并使它们成为同质的 4D 坐标以进行变换 (w = 1),解决方案就来了。

通过计算 C 矩阵:C = M3 * B,我得到了这些新坐标。在计算行列式 d0、d1、d2、d3 时,我曾经从 C 矩阵的第 0 列和第 1 列中获取 x、y 坐标,并从第 2 列中获取 w 因子。错误!当您想到它时,坐标实际上是 3D 坐标,因此,对于 w 因子,应该取第 3 列而忽略第 2 列。

这给了我正确的行列式,从而产生了一个能够区分我正在处理的曲线类型的判别式。

但请注意,使我的搜索时间更长的原因是,我假设当它明显是蛇形时,判别式的结果应该总是 > 0(蛇形)。但情况并非总是如此,当你有一个数学上完美的 septine(坐标使得平均值正好在中间)时,行列式会说它是一个尖点(行列式 = 0)。我曾经认为这个结果是错误的,但事实并非如此。所以不要被这个愚弄了。

于 2013-03-24T13:55:51.590 回答
2

GPU Gem 3 这本书有错误,nVidia 网站上的页面也有错误:

a3 = b2 * (b1 x b1)

它实际上是a3 = b2 * (b1 x b0)

这个算法还有一个问题:在计算过程中浮点的exp部分会溢出,所以你应该小心,在你的代码中添加规范化操作。

于 2015-06-30T02:00:28.933 回答