gpu - 在 GPU 上绘制与分辨率无关的三次贝塞尔曲线 (Blinn/Loop)

标签 gpu resolution bezier cubic

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

GPU Gems 3 Chapter 25

Curvy Blues

Resolution Independent Curve Rendering using Programmable Graphics Hardware

但正如 Curvy Blues 网站所述,其他两个网站上的文档存在错误。 Curvy Blues 让我看看评论,但我似乎找不到那些评论。某个地方的另一个论坛告诉我同样的事情,我不记得那个论坛是什么。但我肯定缺少一些东西。

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

所以我有原始坐标,我将它们粘贴在 4x4 矩阵中,用 M3 矩阵变换该矩阵并得到 C 矩阵。 然后,我根据 C 矩阵中的坐标创建 3x3 矩阵并计算行列式,然后将其组合起来创建二次方程的 a、b 和 c,这将帮助我找到根。

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

谁能帮我解决这个问题吗?

最佳答案

我想我已经解决了这个问题。结果接近完美(有时是相反的,但这可能是另一个问题)。

这就是我出错的地方,我希望我可以帮助其他人不要浪费我浪费在搜索这个问题上的所有时间。

我的代码基于 blinn-phong 文档。 我有坐标 b0、b1、b2、b3。我曾经将它们视为带 w 的 2D 坐标,但我更改了此 View ,这解决了问题。通过将它们视为 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(蛇纹石)。 但情况并非总是如此,当您有一个数学上完美的隔板(坐标使得平均值恰好位于中间)时,行列式会说它是一个尖点(行列式= 0)。我曾经认为这个结果是错误的,但事实并非如此。所以不要被这个愚弄了。

关于gpu - 在 GPU 上绘制与分辨率无关的三次贝塞尔曲线 (Blinn/Loop),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15519142/

相关文章:

ios - 使用 Metal 间接命令缓冲区时出错 : "Fragment shader cannot be used with indirect command buffers"

android - 将 iPhone 图形移植到 Android 时有经验法则吗?

java - 如何提高使用 Graphics2D 绘制的字符串的质量?

video - ffmpeg 通过调整图像大小来设置输出分辨率

c# - 绘制船舶的二维航迹。新华社

animation - 为在 drawRect() Swift 中绘制的贝塞尔曲线路径设置动画

javascript - 将贝塞尔曲线分成相等的两半

macos - 如何在 Metal 中制作模板化计算内核

opencl - Intel 上的 AMD APP OpenCL SDK

android - 如何知道 Android GPU 使用情况?