基于以下资源,我一直试图让GPU上的分辨率独立立方贝塞尔渲染工作:
Resolution Independent Curve Rendering using Programmable Graphics Hardware
但正如Curvy Blues网站所述,其他两个网站的文件中存在错误。 Curvy Blues告诉我看看评论,但我似乎无法找到这些评论。某个地方的另一个论坛告诉我同样的事情,我不记得那个论坛是什么。但肯定有一些我想念的东西。
无论如何,我试图重新发生正在发生的事情,但我无法理解从变换坐标组合的决定因素计算判别式的部分。
所以我有原始坐标,我将它们粘贴在4x4矩阵中,用M3矩阵转换这个矩阵并得到C矩阵。 然后,我创建从在C-矩阵的坐标3×3矩阵和计算的决定因素,其然后可以被组合以创建该二次方程的一个,b和c,这将有助于我发现的根源。
问题是,当我这样做时:判别式是不正确的。我清楚地把蛇形的坐标(一个对称的,但是一个正确的蛇形)放在坐标上,但它说它是一个尖点。 当我自己使用wxMaxima,以获得第一和第二顺序,然后计算叉积,简化到一元二次方程计算的话,这个等式的判别似乎是正确的,当我把在同一坐标。 当我强制代码使用我自己的判别式来确定它是否是蛇形时,但是我使用行列式来计算更多的k,l,m纹理坐标,结果也是不正确的。 所以我认为决定因素一定存在错误。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
我想我已经设法解决了这个问题。结果接近完美(有时倒置,但这可能是一个不同的问题)。
这是我出错的地方,我希望我能帮助其他人不要浪费我浪费时间来搜索这个。
我的代码基于blinn-phong文档。 我有坐标b0,b1,b2,b3。我曾经用w看它们作为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(蛇纹石)。 但情况并非总是如此,当你有一个数学上完美的sepentine(坐标使得平均值恰好是中间)时,行列式将会说它是一个尖点(行列式= 0)。我曾经认为这个结果是错误的,但事实并非如此。所以不要被这个愚弄。
答案 1 :(得分:1)
这篇书籍GPU Gem 3在这里有一个错误,the page on nVidia's website也有错误:
a3 = b2 * (b1 x b1)
实际上是a3 = b2 * (b1 x b0)
。
此算法还存在其他问题:浮点的exp部分在计算过程中会溢出,因此您应该谨慎并在代码中添加规范化操作。