gpt4 book ai didi

c - GBA 开发 - 仿射 Sprite 每 90 度暂停一次,BG 不受影响

转载 作者:行者123 更新时间:2023-11-30 17:42:18 25 4
gpt4 key购买 nike

编辑:我已将该程序精简到其基础:https://github.com/aidan-aidan/temp/blob/master/source/vpp.c

我已经在 gba-dev 论坛上发布了这个问题,但他们似乎已经死了,很多天后我还没有得到回复。

这是显示该问题的视频:http://youtu.be/8gweFiSobwc (与上面的代码不同,如果想看可以运行rom)

正如您所看到的,BG 旋转不受影响,尽管它们使用相同的 LUT 并且在结构中具有相同的数据类型。

我重做了几次LUT都没有效果,这个问题是在切换到2048圈而不是256圈后才出现的。

查看 VBA 中的内存查看器,我可以看到 pb 的行为与 pa 不同。正如我所期望的那样,pa 的范围从 0x0100 到 0(与 1 到 0 相同),但是当枪位于中心线右侧时,pb 的范围从 0 到 0x0096,但一旦从中心线向左走,pb 的范围就跳到 0xFFFF 。我唯一能想到的是它会变成负值(这是有道理的,因为该角度的余弦应该导致负数),但我不完全理解补码,所以我不能确定。 0“度”是枪右侧的水平线。 512 就是九十度。

我已经包含了我能想到的所有内容,感谢任何帮助。

谢谢!

最佳答案

据我所知,该程序在技术上运行正常。相反,您的视觉伪像源于硬件使用的仿射变换中有限的 8 位定点精度。

本质上,正弦表中 0 和 1 之间的差异会导致矩形 Sprite 中直角的旋转产生相当大且可见的跳跃,而 0°/90°/180°/270° 角则为对于圆形地球背景来说并不是那么特别。

(余)正弦函数在 0 处的正切值很高,因此如果您查看表格,就会发现只有一个点恰好为 0。如果旋转没有精确落在该索引上,则结果看起来明显歪斜。

但是,您可以尝试通过摆弄舍入来产生更多连续的零来进行作弊。目前,您的表格生成器正在缩放 256 并四舍五入到最接近的整数:

sine[i] = floor(sin(i * M_PI / 1024.0) * 256.0 + 0.5);

作为一种替代方案,我们可以通过四舍五入到零(C 中的默认值)来稍微倾斜表格,并增加比例以确保表格在多个条目时仍达到 256。

int value = sin(i * M_PI / 1024.0) * 257.0;
if(value < -256) value = -256;
if(value > +256) value = +256;
sine[i] = value;

然后可以通过进一步增加缩放因子来进一步展平表格。

<小时/>

问题还在于,对于接近直角的小 Sprite 来说,没有地方可以旋转。

想象一个 64x1 的直线 Sprite ,几乎以直角垂直指向,与正弦表只有最小的 1/256 小数步长。请记住,旋转始终居中,因此您可以在中心精确地获得一个锯齿状水平台阶。

对于从中心向外的 32 个像素中的每一个,您都将另一个 1/256 分数添加到纹理坐标中。然而,所有这些加在一起仅占总像素的 1/8,因此不再采取更多的水平步骤。事实上,对于这个 Sprite 形状,在旋转角度达到完整的 8/256 分数之前,您不会看到任何明显的变化。

另一方面,您的大型地球物体足够大,可以始终显示多个可见的整数“步骤”。这意味着增加的旋转角度总是至少会移动非居中台阶的位置,即使它不足以沿着整个侧面加起来另一个完整像素。由于连续的动画,结果是更平滑的整体效果。

关于c - GBA 开发 - 仿射 Sprite 每 90 度暂停一次,BG 不受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20644632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com