基于以下资源,我一直在尝试在GPU上获得独立于分辨率的三次贝塞尔渲染:
GPU Gems 3第25章
曲线优美的蓝调
基于可编程图形硬件的独立分辨率曲线渲染
但是正如Curvy Blues网站所述,另外两个网站的文档有错误。Curvy Blues让我看看评论,但我似乎找不到那些评论。另一个论坛告诉我同样的事情,我不记得那个论坛是什么了。但我肯定错过了什么。
无论如何,我试图重新生成正在发生的事情,我无法理解从变换坐标组合的行列式计算出判别式的部分。
我有原始坐标,我把它们放在一个4x4矩阵中,用m3矩阵变换这个矩阵,得到c矩阵。然后我从c矩阵的坐标中创建3x3矩阵,并计算行列式,然后可以将它们组合起来创建二次方程的a, b和c,这将帮助我找到根。
问题是,当我完全这样做时:鉴别是不正确的。我清楚地输入了一个蛇形的坐标(一个对称的,但是一个正确的蛇形),但是它说它是一个尖。当我自己用wxMaxima计算它时,求导到一阶和二阶然后计算叉乘,化简成二次方程,当我在相同的坐标下,这个方程的判式似乎是正确的。当我强迫代码使用我自己的判别式来确定它是否是蛇形,但我使用行列式来计算进一步的k,l,m纹理坐标时,结果也是不正确的。所以我推测行列式中一定有错误。
谁能帮我弄明白这个?我想我已经设法解决了。结果接近完美(有时是相反的,但这可能是另一个问题)。
这就是我错的地方,我希望我能帮助其他人不要浪费我浪费的时间来搜索这个
我的代码是基于blinn-phong文档的。坐标是b0 b1 b2 b3。我以前把它们看成带w的二维坐标,但是我改变了这个观点,这就解决了问题。通过将它们视为z = 0的三维坐标,并使它们成为齐次的四维坐标进行变换(w = 1),得到了解决方案。
通过计算C矩阵:C = M3 * B,我得到了这些新的坐标。当计算行列式d0 d1 d2 d3时,我用C矩阵中第0列和第1列的x y坐标,和第2列的w因子。错了!当你想到它时,坐标实际上是三维坐标,所以,对于w因子,应该取第3列而忽略第2列。
这给了我正确的行列式,从而产生了一个判别法,能够区分出我正在处理的曲线的类型。
但是要注意,使我的搜索更长的事实是,我假设当它是明显的蛇形时,判别式的结果应该总是> 0(蛇形)。但这并不总是这样,当你有一个数学上完美的七轴线(坐标是这样的,平均值是精确的中间),行列式会说它是一个尖点(行列式= 0)。我曾经认为这个结果是错误的,但它不是。所以不要被这个欺骗了
《GPU Gem 3》这本书在这里有一个错误,nVidia网站上的页面也有这个错误:
a3 = b2 * (b1 x b1)
实际上是a3 = b2 * (b1 x b0)
。
这个算法还有其他问题:浮点数的exp部分在计算过程中会溢出,所以你应该小心,并在代码中添加规范化操作。