或者另一个类似的例子:想象一下,你有一个时间序列,每个样本的粒度为一毫秒,当你缩小以揭示数年的数据时。 我的问题是:当大量数据被混合成单个像素时,这样的细节数据最终如何呈现出来?
您是否必须浏览整个数据集来渲染该像素(例如,在时间序列的情况下:仅遍历百万记录将其平均为1行,或在CAD的情况下渲染整个矢量图并将其模糊为小点),或者可以应用某些详细级别优化,使您不必这样做?
如果是这样,请问它们是如何工作的,以及可以在哪里学习相关知识?
这是游戏开发中非常常见的问题。在下面,我假设您正在使用场景图,即基于节点的对象树。
典型的解决方案涉及以下技术的混合使用:
在最低级别上,甚至可以只使用对象的边界框。检查边界框是否可见只需约1-7点检查,具体取决于您如何检查。您可以利用对象的父子关系进行传递性边界框。
裁剪:如果一个多边形在视口中根本不渲染,则无需渲染它。在您发布的GIF中,当相机放大到新场景时,大模型留下的是后景中的单个多边形。
重新缩放世界坐标:随着缩放的增加,顶点的坐标变为小于零的浮点数。考虑到您希望所有坐标尽可能精确,而现代CPU只能处理64位精度的浮点数(并且通常仅使用32位以获得更好的性能),重置可见对象的缩放是个好主意。我的意思是,当相机缩放到前一视图的1/1000时,您可以将较大的对象增加1000倍,并同时调整相机位置和焦距。任何新附加的小模型都将使用其原始比例,从而保留其精度。这种过渡对观众来说是不可见的,但允许您在无限缩放的同时保持明确定义的3D坐标。
在更高级别上:当您缩进某些东西并且相机靠近对象时,它似乎相对于视图增长了。通常情况下,相机空间正在移动,而世界被相机的矩阵乘以。通过改变世界坐标而不是相机,可以实现相同的效果。
首先,您可以使用缓存。像地图制图一样使用瓦片。您仍然需要遍历所有点,但之后您将能够快速缩放。
但是,如果您没有额外的缓存内存(实际上不需要太多,比数据本身少得多),或者没有时间遍历所有点,则可以使用概率方法。
这可以简单地是每隔一个点进行窥视(或每10个点或适合您的任何其他数量)。对于某些数据,它产生了不错的结果。同样在地图制图中,它对海岸线非常有效,但对于具有许多直线的房屋或行政边界等则效果不佳。
或者,您可以采取更为激进的概率方法:随机窥视一些点,例如,如果有100个数据点击中像素一
,而只有50个点击中像素二
,那么您可以比较安全地假设如果您继续窥视点,像素一
被击中的可能性将是像素二
的两倍。因此,您可以放弃并以两倍的浓度颜色绘制像素一
。
rgb(123,12,54)
和rgb(123,11,54)
之间的区别?