【问题标题】:Sprite Sheet With OpenGL and SDL带有 OpenGL 和 SDL 的精灵表
【发布时间】:2011-09-21 17:32:10
【问题描述】:

我一直在开发一款新游戏,终于开始编写主角的动作,但我对如何做到这一点存有疑问。

以前,我在 Allegro 中制作了两个游戏,所以 spritesheets 很容易实现,因为我在图像上建立帧和位置,并将每一帧保存在不同的位图中,但我知道使用 OpenGL 可以做到这一点这不是必需的,而且成本更高。

所以,我一直在考虑如何保存我的 spritesheet 并在我的程序中使用,我只有一个想法。

我加载了图像并转换为纹理,在帮助我制作动画的函数中,我只是抓取纹理的一部分进行绘制,而不是将每个纹理都存储在我的程序中。

这是最好的方法吗?

在此先感谢您的帮助。

【问题讨论】:

    标签: c++ opengl sdl textures sprite-sheet


    【解决方案1】:

    你在正确的轨道上。

    需要考虑的事项:

    • 在每个精灵周围留出足够的死区,以使视频卡不会以小比例混合来自相邻精灵的纹素。
    • 适当设置纹理最小/放大过滤。如果您想要块状外观,则 GL_NEAREST 是可以的。
    • 如果你想花哨并节省一些纹理内存,没有理由必须在规则网格中布置精灵。较小的精灵可以在纹理中更紧密地包装。
    • 如果您的 sprite 是从 3D 模型渲染的,您可以将模型中的法线和置换贴图输出到另一个纹理中,然后将它们组合到片段着色器中以获得一些很棒的光照和自阴影。

    【讨论】:

    • 感谢您的提示。我会用这种方法来处理角色的动作。
    【解决方案2】:

    您的想法是对的,如果您有一堆精灵,最好将它们全部粘贴在一个大纹理中。只需将您的精灵绘制为纹理四边形,其纹理坐标索引到精灵的框架中。您可以进行一些优化,但其中大部分都围绕着尝试充分利用纹理内存并将精灵紧密打包在一起而不会出现混合问题。

    【讨论】:

    • 感谢您的提示和帮助。
    【解决方案3】:

    我知道用 OpenGL 这样做是不必要的,而且成本会更高。

    为什么不呢?将大量精灵放入单个纹理中并没有真正的缺点。您需要做的就是更改纹理坐标以从纹理中挑选出有问题的区域。

    【讨论】:

    • 你失去了上下文,似乎他的意思是“没有必要将每一帧保存在不同的位图中”
    • 我的意思是,将每个精灵保存在一个唯一的纹理中,这是浪费视频卡的容量。因为如果 spritesheet 有例如 16 个 sprite,如果我在程序执行期间保存 16 个纹理,那么只存储一个包含所有 sprite 的纹理的成本有点高。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2014-07-26
    • 2012-04-21
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多