在没有剪裁的情况下缩放SDL曲面的正确方法?

时间:2008-11-30 05:43:32

标签: opengl sdl

缩放SDL曲面的正确方法是什么?我在网上找到了一个解释,但它需要逐像素地重新绘制Surface。似乎应该有一些方法通过SDL本地执行此操作,而不是像这样重新绘制图像。我无法在SDL文档中找到任何涉及此内容的内容。通过修改曲面宽度和高度,我可以毫无问题地调整曲面大小,但会剪切生成的曲面。

3 个答案:

答案 0 :(得分:7)

SDL不支持缩放blitting。根据{{​​3}}的文件:

  

注意:SDL阻击器(尚未)   有能力缩放   像上面或下面的blitted表面   与其他更复杂的情况   blitting机制。你必须   如果你自己想办法的话   你想缩放图像(例如使用   SDL_gfx)。

你可以找到SDL_gfx SDL_BlitSurface。编写自己的blitting函数并不是那么糟糕,它可能是一个有趣且有用的学习实验(尽管你将重新发明轮子)。使用OpenGL也是一种选择,因为缩放和旋转等功能可以在单个函数调用中完成。

答案 1 :(得分:5)

我知道这个答案为时已晚,无法协助提出要求的人,但我决定写这个来帮助那些偶然发现这个问题的人。在SDL 2.0中您可以使用SDL_BlitScaled()函数将曲面缩放为目标SDL_RectLazyFoo有一个教程可以对此进行描述,或者查看此documentation

答案 2 :(得分:1)

为了完整性,并且因为问题没有指定SDL版本,可以使用API​​方法SDL_RenderCopyEx在SDL2中进行缩放。除了基本的SDL2 lib之外,不需要额外的库。

int SDL_RenderCopyEx(SDL_Renderer*          renderer,
                     SDL_Texture*           texture,
                     const SDL_Rect*        srcrect,
                     const SDL_Rect*        dstrect,
                     const double           angle,
                     const SDL_Point*       center,
                     const SDL_RendererFlip flip)

通过设置dstrect的大小,可以将纹理缩放为整数个像素。也可以同时旋转和翻转纹理。

从技术上讲,这不是缩放曲面而是缩放纹理。该过程应该是相关的,因为在基于SDL2的应用程序中进行渲染之前,曲面几乎总是转换为纹理。

参考:https://wiki.libsdl.org/SDL_RenderCopyEx

像往常一样创建纹理:

surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);

当需要呈现时,请致电SDL_RenderCopyEx而不是SDL_RenderCopy