SDL2(2.0.3)中的SDL_RenderSetScale不正确地应用于旋转的位图。

6
SDL_RenderSetScale函数会按比例缩放坐标,直到使用SDL_RenderCopyEx函数进行旋转。SDL似乎在旋转之前应用了缩放,因此旋转后的纹理宽高比不正确。例如,旋转90度的纹理将使x和y缩放反转。我尝试计算一个公式来抵消这种缩放效果,但结果并不理想。
我还注意到,使用SDL_RenderDrawLine画出的直线在缩放时会有不同的粗细,而对角线仍然是以屏幕像素为单位进行绘制。
是否有其他人遇到了这个问题?是否有其他解决方案可以得到所需的结果?是否有计划修复SDL2,使缩放效果始终保持一致?
3个回答

3

很遗憾,不行。该问题在宽度和高度缩放因子不同时变得明显。请尝试:

SDL_RenderSetScale(renderer, 4.0f, 2.0f);
SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);

…然后你就能看到问题了。

你预计一个最初是正方形贴图现在会变成宽长方形,但实际上它是一个高长方形。

缩放是在旋转之前应用的——而我个人预期缩放应该是在旋转之后应用的,因为SDL_RenderSetScale()的整个意义似乎是允许选择一个独立的坐标系统,但如果两个坐标系统的纵横比不同,则任何旋转的贴图都会显示错误。

Ronnie


2
这个问题已经被问了四年,但我仍然面临这个问题。所以,如果有人看到,请看我的回答。
Lignum关于SDL版本控制的假设是错误的。事实上,我正在使用SDL 2.0.9,这个问题仍然存在。正如Ronnie所指出的那样,只有在宽高比没有保持一致时才会出现这个问题(在Lignum的代码示例中,宽高比得到了保持,因为x和y轴上的比例因子是相等的)。
唯一的解决方案,恐怕就是简单地避免使用SDL_RenderSetScale,并手动缩放SDL_RenderCopyEx中目标矩形的坐标。

1
我还在这里,而且你是对的,这仍然是个bug。手动缩放仍然存在问题——很难解释。如果你要求SDL2旋转一个长方形,它会旋转长方形,并拉伸和旋转纹理以填充长方形。但是如果你想先旋转纹理,然后再缩放呢?我想你可以把它渲染成旋转后的目标纹理,然后在渲染时缩放目标。我已经在SDL2的Bugzilla中提出了这个bug,所以它最终会得到解决。 - Ant the Alchemist

1
使用这段代码,恐怕我无法复现这个问题:
SDL_RenderSetScale(renderer, 4.0f, 4.0f);

SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);

这个可以完美运行,图像旋转了90度,并按4倍比例缩放。由于我的回复是在两年之后,我认为这可能是SDL 2.0.3中的一个bug,因为我使用的是SDL 2.0.5。
即使在最新版本上也会出现这种情况,也不必失去所有希望。另一种方法是简单地将目标矩形的宽度和高度乘以所需的比例,根据我的经验,这同样有效。考虑到您将直接将矩形传递到SDL_RenderCopyEx中,该函数在旋转时应该一定要记住这一点。

缩放问题不会影响与平方缩放因子相结合的正方形,这就是为什么您没有复制该问题的原因,该问题在SDL 2.0.14中仍然存在。 - Ant the Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接