【问题标题】:Proper way to scale an SDL Surface without clipping?在不裁剪的情况下缩放 SDL 曲面的正确方法?
【发布时间】:2008-11-30 05:43:32
【问题描述】:

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

【问题讨论】:

    标签: opengl sdl


    【解决方案1】:

    我知道这个答案太迟了,无法帮助提出这个问题的人,但我决定写这个来帮助任何偶然发现这个问题的人。在 SDL 2.0 中,您可以使用 SDL_BlitScaled() 函数将表面缩放为目标 SDL_RectLazyFoo 的教程对此进行了描述,或查看此 documentation

    【讨论】:

      【解决方案2】:

      SDL 不支持缩放位传输。根据SDL_BlitSurface的文档:

      注意:SDL blitter 不(还) 具有缩放的能力 像这样向上或向下涂抹表面 与其他更复杂的情况 位机制。你必须 如果你自己想办法 你想缩放图像(例如使用 SDL_gfx)。

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

      【讨论】:

        【解决方案3】:

        为了完整起见,并且由于问题未指定 SDL 版本,因此可以在 SDL2 中使用 API 方法 SDL_RenderCopyEx 进行缩放。除了基本的 SDL2 库之外,不需要额外的库。

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          • 2022-01-11
          • 2014-10-12
          相关资源
          最近更新 更多