SDL - Blit Surface将浮点值作为rect参数传递

时间:2013-07-09 11:36:51

标签: c sdl floating-point-precision rect blit

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

恢复:如何在SDL上blitting曲面时使用精度?

3 个答案:

答案 0 :(得分:3)

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

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

您可以找到有关功能here或API页面herehere的一些说明。

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

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

答案 1 :(得分:1)

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

话虽如此,为了获得更高的精度,我想你可以切换到OpenGL中的渲染四边形。当硬件与屏幕像素没有正确对齐时,硬件将负责计算纹理的像素颜色,从而产生“模糊”纹理,但至少你可以完全控制它们的位置。

答案 2 :(得分:0)

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

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