首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球面纹理坐标的快速逼近

球面纹理坐标的快速逼近
EN

Computer Graphics用户
提问于 2017-05-10 13:33:27
回答 2查看 654关注 0票数 4

我正在工作的软件Rasterizer在一个潜艇-30 MHz RISC,我目前的重点是放大-在一个缓慢旋转的行星。对于最大的质量,没有三维多边形涉及到行星-行星纹理是纯粹的图像为基础。这就是我所拥有的:

  • 这颗行星只绕Y轴旋转,在赤道用相机直接观察(所以你看不到极点,因此默认的极点畸变伪像在这里根本不是问题)
    • 每次迭代计算8个端点的中点Bresenham圆算法,有效地给出了4条水平扫描线。
    • 纹理行和行星扫描线之间的简单线性重映射--例如,如果行星在屏幕上有64像素高,纹理是128像素高,我只需跳过其他行
    • 每条扫描线内相同的线性重映射--例如,如果当前扫描线宽64像素,纹理宽128像素,我只需跳过当前纹理行中的所有其他纹理。

以上工作,是伟大的第一个工作和合理的快速原型。然而,当行星旋转时,尽管屏幕分辨率很低,但由于简单的线性重映射(在每条扫描线内),它感觉和看起来都不像行星自转,因为球体边缘(圆圈的左边缘和右边)的透视/失真/拉伸显然是缺失的。

什么方程可以给我精确的纹理坐标,对于当前的纹理行,每个屏幕上的像素圆圈的扫描线?

请注意,我不能计算sin/cos (或使用预先计算的表)。除法是昂贵的,但我也许可以通过与其他指令交织来隐藏它的延迟(同时计算除法)。所以,理想情况下,我可以通过add/sub/mul/位移位来计算它。显然,由于对称性,计算出的坐标将被重复使用到其他三个点,所以我们实际上只计算了圆的25%的点。

EN

回答 2

Computer Graphics用户

回答已采纳

发布于 2017-05-10 23:20:26

顺便提一句,大约20年前,我为类似的硬件设置了实现了类似的东西 (:

IIRC,我计算了一维查表,使用acos来并行投影一个圆柱体,然后对每条扫描线进行缩放,以降低计算成本。LUT只是给你x坐标偏移到纹理,你添加常量偏移为每个扫描线旋转。

对于y轴,可以对输入纹理进行预处理,使其具有适当的球面失真,并且您只需对纹理垂直进行线性缩放即可。不过,运行时也没有那么多额外的计算。

这不能给你正确的透视投影,但可能对你的目的来说就足够了。

编辑:没注意到你说你买不起LUT。您可以在每N个像素上查找表,并在中间线性内插。在过去,这是一种常见的方法,用于对软件光栅器进行可负担的透视图、正确的纹理映射,以避免div/像素。

票数 3
EN

Computer Graphics用户

发布于 2017-05-10 13:49:43

使用正确的纹理映射,可以避免对样本点进行大量复杂的数学计算。例如,兰伯特柱面等面积投影将允许您保持y坐标不变,而x坐标仅取决于您所处的子午线。

然后你可以使用bresenham的椭圆算法来绘制地球上所有可见的子午线。

票数 0
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/5090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档