我正在工作的软件Rasterizer在一个潜艇-30 MHz RISC,我目前的重点是放大-在一个缓慢旋转的行星。对于最大的质量,没有三维多边形涉及到行星-行星纹理是纯粹的图像为基础。这就是我所拥有的:
以上工作,是伟大的第一个工作和合理的快速原型。然而,当行星旋转时,尽管屏幕分辨率很低,但由于简单的线性重映射(在每条扫描线内),它感觉和看起来都不像行星自转,因为球体边缘(圆圈的左边缘和右边)的透视/失真/拉伸显然是缺失的。
什么方程可以给我精确的纹理坐标,对于当前的纹理行,每个屏幕上的像素圆圈的扫描线?
请注意,我不能计算sin/cos (或使用预先计算的表)。除法是昂贵的,但我也许可以通过与其他指令交织来隐藏它的延迟(同时计算除法)。所以,理想情况下,我可以通过add/sub/mul/位移位来计算它。显然,由于对称性,计算出的坐标将被重复使用到其他三个点,所以我们实际上只计算了圆的25%的点。
发布于 2017-05-10 23:20:26
顺便提一句,大约20年前,我为类似的硬件设置了实现了类似的东西 (:
IIRC,我计算了一维查表,使用acos来并行投影一个圆柱体,然后对每条扫描线进行缩放,以降低计算成本。LUT只是给你x坐标偏移到纹理,你添加常量偏移为每个扫描线旋转。
对于y轴,可以对输入纹理进行预处理,使其具有适当的球面失真,并且您只需对纹理垂直进行线性缩放即可。不过,运行时也没有那么多额外的计算。
这不能给你正确的透视投影,但可能对你的目的来说就足够了。
编辑:没注意到你说你买不起LUT。您可以在每N个像素上查找表,并在中间线性内插。在过去,这是一种常见的方法,用于对软件光栅器进行可负担的透视图、正确的纹理映射,以避免div/像素。
发布于 2017-05-10 13:49:43
使用正确的纹理映射,可以避免对样本点进行大量复杂的数学计算。例如,兰伯特柱面等面积投影将允许您保持y坐标不变,而x坐标仅取决于您所处的子午线。
然后你可以使用bresenham的椭圆算法来绘制地球上所有可见的子午线。
https://computergraphics.stackexchange.com/questions/5090
复制相似问题