我正在尝试从图形纸张实现算法,并且算法的一部分将已知半径的球体渲染到缓冲区。他们说他们通过计算顶点着色器中的位置和大小来渲染球体,然后在片段着色器中进行适当的着色。
是否有任何关于他们如何实际做到这一点的猜测?位置和半径在世界坐标中是已知的,投影是透视的。这是否意味着球体将被投影为圆圈?
答案 0 :(得分:3)
我发现了一篇描述你需要的论文 - 计算边界二次曲线。参见:
http://web4.cs.ucl.ac.uk/staff/t.weyrich/projects/quadrics/pbg06.pdf
第3.2节,边界框计算。本文还提到在顶点着色器上进行此操作,因此它可能就是您所追求的。
一些个人想法:
但是,您可以通过用半径近似球体的大小来近似边界框。将其转换为屏幕空间,您将得到一个比正确的边界框稍大的数据,但它不会那么遥远。当相机太靠近该点时,或者当球太大时,这会失败。但是否则应该是非常优化的计算,因为它只是两个相似的直角三角形之间的比率。
如果你能算出和弦长度,那么这个比例就会产生精确的答案,但是目前这还不过我。
alt text http://xavierho.com/temp/Sphere-Screen-Space.png
当然,这只是一个粗略的近似,并且有时会出现大错误,但它会让事情变得快速,简单。
否则,请参阅上面链接的论文并使用正确的方法。 =]
答案 1 :(得分:1)
球体将被投影为椭圆形,除非它像在脑筋中所说的那样位于相机中心。
Xavier Ho链接的文章描述了球体投影的推广(即二次投影)。这是一个非常好的阅读,我也推荐它。但是,如果您只对球投影感兴趣,更准确地说是对投影进行约束的四边形,那么The Mechanics of Robust Stencil Shadows, page 6: Scissor Optimization将详细说明如何进行投影。
我想补充一点,Xavier Ho建议的近似值,正如他所指出的那样,非常近似。我实际上将它用于基于图块的前向渲染器来近似屏幕空间中的光边界。下图显示了如何通过场景中的400个全向(球形边界)灯光整齐地实现良好性能:Tile-based Rendering - Far View。然而,正如Xavier Ho预测的那样,光线界限的不准确性会导致伪影近似,如放大时所见:Tile-based Rendering - Close view。重叠的四边形无法完全绑定灯光,而是剪切显示平铺网格的边缘。
答案 2 :(得分:0)
通常,球体在透视中被视为椭圆。 alt text http://psychology.jrank.org/article_images/psychology.jrank.org/perspective.7.jpg
上图位于this article的底部。
this article的第6节描述了如何获得球体投影的边界梯形。在计算机之前,艺术家和绘图员必须手工解决这个问题。