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

Opengl 使用顶点着色器计算球体的边界四边形,opengl,geometry,fragment-shader,vertex-shader,Opengl,Geometry,Fragment Shader,Vertex Shader,我试图从一张画纸上实现一个算法,其中一部分算法是将已知半径的球体渲染到缓冲区。他们说,他们通过计算顶点着色器中的位置和大小,然后在片段着色器中进行适当的着色来渲染球体 有人猜测他们是怎么做到的吗?位置和半径在世界坐标中是已知的,投影是透视的。这是否意味着球体将被投影为一个圆 我找到了一篇描述你需要什么的论文——计算边界二次曲面。见: 第3.2节,边界框计算。论文还提到了在顶点着色器上执行此操作,因此这可能是您所追求的 一些个人想法: 但是,可以通过近似球体的半径来近似边界框的大小。将其转换为屏

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


有人猜测他们是怎么做到的吗?位置和半径在世界坐标中是已知的,投影是透视的。这是否意味着球体将被投影为一个圆

我找到了一篇描述你需要什么的论文——计算边界二次曲面。见:

第3.2节,边界框计算。论文还提到了在顶点着色器上执行此操作,因此这可能是您所追求的

一些个人想法:

但是,可以通过近似球体的半径来近似边界框的大小。将其转换为屏幕空间,您将得到比正确边界框稍大的边界框,但不会太远。当然,当相机离点太近,或者球体太大时,这会失败。但除此之外,它应该是非常适合计算的,因为它只是两个相似的直角三角形之间的比率

如果你能算出弦长,那么这个比率会给出精确的答案,但这一点我现在还不太清楚

当然,这只是一个粗略的近似值,有时会有很大的误差,但它可以让事情快速、简单地进行


否则,请参阅上面链接的纸张并使用正确的方式。=]

通常,球体在透视图中被视为椭圆:


(来源:)

上面的图片在这个页面的底部


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

除非球像brainjam所说的那样位于摄像机中心,否则它将被投影成椭圆

Xavier Ho链接到的文章描述了球面投影(即二次投影)的推广。这是一本非常好的书,我也推荐它。但是,如果您只对球体投影感兴趣,更精确地说,对限制投影的四边形感兴趣,那么请详细说明如何进行此操作

关于Xavier-Ho近似的一个注记
我想补充一点,Xavier Ho提出的近似值,正如他所指出的,也是非常近似的。实际上,我将其用于基于平铺的正向渲染器,以近似屏幕空间中的灯光边界。下图显示了它如何巧妙地在场景中使用400个泛光(球形绑定)灯光实现良好性能:。然而,正如Xavier Ho预测的那样,光线边界的不准确会导致近距离的伪影,如放大时所见:。重叠的四边形无法完全绑定灯光,而是剪裁出瓷砖网格的边缘。

我认为,如果您引用您正在使用的图形纸,这会很有帮助。哎呀,忘了提到他们使用四边形了。这是报纸。我指的是5.1节:“GPU上的飞溅是通过在图像平面上绘制一个紧密包围飞溅球体的四边形来执行的。四边形的位置和大小是使用顶点着色器计算的。然后对每个碎片进行处理,使其值代表记录的加权贡献。”我想我将使用你们这里的近似值,因为在片段着色器中,我可以准确地测试片段是否应该贡献,顶点着色器实际上只是试图减少我必须处理的片段数量。@glorfinel:脚本似乎已经去掉了psychology.jrank.org链接的其余部分。对,谢谢你接电话。我以前曾试图抓住这些例子,但结果要难得多;该脚本甚至无法处理堆栈溢出用户更改名称的问题。也许如果一个特定的URL重定向到一个裸域(或者类似/index.html的东西),它应该更喜欢Wayback机器链接。