似乎在所有现有图形库中,总是以三角形描述3D对象。绘制三角形可以在视频硬件上非常有效地实现,并且由于可以用三角形近似任何3D对象,因此三角形是唯一需要的基本元素。三角形可以用三元组表示,并且使用起来很简单。

我一直想知道是否尝试过其他方法。用三角形近似球形物体时,存在某些复杂性。是否有其他方法可以绘制球形对象(例如,不使用多边形作为近似值)?使三角形成为最佳选择的方法有什么问题?

评论

许多光线追踪器实现分析形状。实际上,我们是从那开始3D的,然后进行了分析形状的切块,然后才开始使用多边形。
您可能有兴趣阅读有关1990年代Ecstatica系列的椭圆体渲染的信息。 !Ecstatica屏幕截图

为了建模更通用的曲面,通常还使用3d样条线,例如Bézier面片和NURBS曲面。大多数图形应用程序仅使用三角形来近似这些曲线,但是有些显示方法不需要这种近似。

#1 楼

如Daniel所言,光线追踪是渲染球体的好方法。下面是我制作的光线追踪场景的屏幕截图,但不幸的是丢失了源代码。在射线与物体之间进行解析求解并不总是那么容易,期望或什至是不可能的。在光线行进中,您会沿光线向下移动,并在每一点询问您是在对象内部还是外部(或者,在对象上方还是在下方)。当答案改变时,您就知道射线的交点发生在您在射线上测试的当前点与最后一个点之间。

一旦知道交点发生在这两个点之间,您可以做各种事情根据质量需求与计算成本来尝试找到实际的相交点。一些常见的技术:


只接受测试的当前点或最后一个点作为交点(最快)
二进制搜索范围以获得更好的答案
您可以通过一个函数为您提供从点到曲面的(估计)有符号距离,而不仅仅是“内部与外部”测试,还可以在最后一个点和当前点之间进行线性插值,以找到0“是,并将其作为您的交点。这是我个人最成功的方法。

请注意,您可以使用有限差分和梯度使用数字方式获得估计的有符号距离。检查此链接以获取有关以下内容的更多信息:http://www.iquilezles.org/www/articles/distance/distance.htm

您可以在此处找到有关有限差分法的更多信息:
http://blog.demofox.org/2015/08/02/finite-differences/

通过带符号的距离估算功能,您还可以使用渐变来获取法线用于着色。

下面是定义为函数$ z = f(x,y)$的光线行进曲面,并且是此webgl2交互式演示的屏幕截图:http://demofox.org/LeastSquaresSurfaceFit.html



或者,这是一个阴影弹药,它使射线行进一个立方贝塞尔曲线矩形-它在每个轴上都是立方的,因此度数(3,3)也是如此:https://www.shadertoy.com/view / 4tfXz2



回到讨论球体时,您也可以将球体栅格化为2d圆(可能会因“视图/投影矩阵类型”设置在“ 2d“),然后对其进行阴影处理,就好像它是3d对象一样。它也可以用于非球面,并且您会在元球的渲染中看到很多。

以下是渲染元球的shadertoy的屏幕截图:https://www.shadertoy.com/view/ 4sXXWM



最后,我想提一提,所有这些技术也都与传统渲染器兼容。就像丹尼尔说的那样,您可以绘制一个大于形状的屏幕空间广告牌(或绘制一个包含它的世界空间缩放且定向的单位立方体),然后在像素内进行光线追踪,光线行进或光栅化/伪造3D照明着色器,将这些技术与标准栅格化渲染方法混合使用。

#2 楼

一种标准技术是在像素着色器中使用射线/球体相交测试。一个人画一个广告牌,要大到足以覆盖球体可能出现在屏幕上的区域(或画一个边界立方体),以减少浪费的交叉测试的次数(可以使用其他几何形状)。如果相交测试失败,该片段将被杀死;如果发生相交,则会在像素着色器中计算适当的深度值并输出以进行进一步的可见性测试。