使用顶点着色器计算球体的边界四边形

8

我正在尝试实现一篇图形论文中的算法,其中一部分是将已知半径的球体渲染到缓冲区。他们说通过在顶点着色器中计算位置和大小,然后在片段着色器中进行适当的着色来渲染球体。

你猜想他们是如何做到这一点的吗?位置和半径都以世界坐标为基础,投影是透视的。这是否意味着球体会被投影成圆形?


如果您能引用您正在实现的图形论文,那将会很有帮助。 - Xavier Ho
糟糕,忘记提到他们使用四边形。这是该论文的链接:http://www.irisa.fr/prive/kadi/SiteEquipeAsociee/Site_RTR2A/Papiers/rcplat_derniere.pdf我所指的部分是5.1:“在GPU上进行点精灵绘制时,通过在图像平面上紧密包围点精灵球体的四边形来实现。使用顶点着色器计算四边形的位置和大小。然后处理每个片段,使其值表示记录的加权贡献。” - Ben Jones
3个回答

2
我找到了一篇论文,描述了你需要的内容-计算边界四面体。请参阅:
http://web4.cs.ucl.ac.uk/staff/t.weyrich/projects/quadrics/pbg06.pdf
第3.2节,边界框计算。该论文还提到可以在顶点着色器上执行此操作,因此这可能是您要寻找的内容。
个人想法:
您可以通过近似球体的大小来近似边界框,方法是用其半径进行变换,然后转换为屏幕空间,您将得到一个略大于正确边界框的结果,但不会差太远。当然,当相机靠近点或球体太大时,这种方法就会失败。但是,否则应该是相当优化的计算方式,因为它只是两个相似的直角三角形之间的比率。
如果您能找出弦长,则比率将产生精确的答案,但这对我来说有点超过了。
当然,那只是一个粗略的近似值,并且有时误差很大,但它可以快速、轻松地启动事情。
否则,请参阅上面链接的论文并使用正确的方法。 =]

我想我会使用你这里的近似值,因为在片段着色器中,我可以精确地测试片段是否应该做出贡献,而顶点着色器真正要做的只是减少我需要处理的片段数。 - Ben Jones

1

除非它在相机中心,否则球体将被投影为椭圆形,正如brainjam所说。

Xavier Ho链接的文章描述了球体投影(即二次投影)的概括。这是一篇非常好的阅读材料,我也推荐它。然而,如果您只对球体投影和更精确地限制投影的四边形感兴趣,则Robust Stencil Shadows的机械原理,第6页:剪刀优化详细介绍了如何实现。

关于Xavier Ho的近似说明

我想补充一下,Xavier Ho提出的近似方法正如他所指出的那样,非常粗略。我实际上将其用于基于瓦片的前向渲染器中,以在屏幕空间中近似光边界。以下图像展示了它如何使得在场景中使用400个全向(球形边界)灯光时能够良好地实现性能:Tile-based Rendering - Far View。然而,就像Xavier Ho预测的那样,光边界的不准确性会导致近距离处出现伪影,如此处放大后所见:Tile-based Rendering - Close view。重叠的四边形无法完全包围灯光,而是剪裁边缘,显示出瓦片网格。

0

一般来说,球体在透视中被看作是一个椭圆:

alt text
(来源:jrank.org)

上述图片位于这篇文章的底部。

第6节这篇文章描述了如何获得球体投影的边界梯形。在计算机出现之前,艺术家和绘图员必须手工解决此问题。


@Glorfindel:这个脚本似乎已经剥离了那个 psychology.jrank.org 链接的其余部分。 - genpfault
1
好的,谢谢你指出这个问题。我之前试过捕捉这些实例,但很难;脚本甚至不能应对Stack Overflow用户更改姓名的情况。如果特定的URL重定向到一个裸域名(或类似/index.html的东西),那么它应该优先考虑Wayback Machine链接。 - Glorfindel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接