1

我需要根据某些水平和垂直速度在屏幕上移动表面。我需要这些速度是完全随机的。我的想法是生成随机浮点数(我成功了)并将它们用作速度。这样我可以有许多不同的速度,永远不会太快或太慢。问题是:SDL_BlitSurface只接受 aSDL_Rect作为参数来确定绘制表面的新矩形,并且SDL_Rect是一个由 4 个组成的结构int:两个用于坐标,两个用于维度;

恢复:在 SDL 上对曲面进行 blitting 时如何精确工作?

4

3 回答 3

4

有一种解决方案可以实际显示具有半像素精度的表面。有性能成本,但它呈现得非常好。这基本上就是老式抗锯齿的工作原理:以更高的分辨率渲染然后缩小。

win = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); //create a new rendering window
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); //create a new renderer
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");  // make the scaled rendering look smoother.
SDL_RenderSetLogicalSize(renderer, width*2, height*2); //tell the renderer to work internally with this size, it will be scaled back when displayed on your screen

您可以在此处或此处此处的 API 页面上找到有关这些功能的一些说明。

现在您可以像使用两倍大的窗口一样使用它,但它仍然以相同的大小输出。当您进行输出时,您将相同的 SDL_Rect 放入 blitting 函数中,但所有内容都加倍。这样你就可以保持半像素精度。如果您的精灵也具有更高的精度,您可以获得更清晰的输出。

您也可以使用四分之一像素精度执行此操作,但性能成本会更大,因此在您的应用程序中可能无法实现。还有一个内存成本,因为表面更大(半像素精度乘以四,四分之一像素精度乘以十六)。

于 2015-05-20T03:33:22.453 回答
1

SDL_BlitSurface正在使用像素,不幸的是你不能有“半像素”。您仍应将对象的坐标表示为float,但int在将它们传递给您的SDL_Rect. 由于您SDL_Surface的 s 将始终完美地落在屏幕像素上,因此您的图形应始终保持清晰。

话虽如此,为了获得更高的精度,我想您可以切换到在OpenGL. 当纹理与屏幕像素未正确对齐时,硬件将负责计算纹理的像素颜色,从而导致“模糊”纹理,但至少您可以完全控制它们的位置。

于 2013-07-10T01:56:00.227 回答
0

在渲染时处理亚像素精度是没有意义的,因为根据定义,像素是光栅图形中最小的可寻址元素。

您可以在渲染时将位置四舍五入到最接近的整数,例如(Sint16)(x+0.5). 如果需要,应用程序的其余部分仍然可以使用更高精度的坐标。

于 2013-07-09T11:46:44.347 回答