gpt4 book ai didi

opengl - 具有多种纹理的 VBO

转载 作者:行者123 更新时间:2023-12-02 09:44:51 28 4
gpt4 key购买 nike

你能渲染一个由四边形组成的 VBO,每个四边形都具有不同的纹理吗?现在,我读到了有关按纹理或纹理图集排序的内容,但这仍然不能回答我的问题。我正在开发一款 2d 游戏。现在我的动画 Sprite 将拥有其帧的纹理图集和法线贴图,并且所有这些都将共享相同的 VBO(如果可能)。所以每个 Sprite 都会有一个图集(某些动画可能有很多帧和姿势,可能会填充 4096*4096 纹理)。那么有可能吗?是还是不是。如果不是,为每个 Sprite 拥有一个带有其所有动画帧的所有纹理坐标的索引 VBO,并且每帧仅发送 4 个索引(对于单个动画帧)并更改每个 VBO 的纹理是否有效?编辑:其中一些可能会移动(显然),有些可能不会。

<小时/>

经过一番思考,我意识到内存使用也是一个问题。这些纹理图集会占用大量内存。一个 4096*4096 RGBA 纹理需要 64 MB,这很大了(而且没有法线贴图,这会使使用量增加一倍)。而且我认为我无法将这么多动画塞进一个图集中。像《暗黑破坏神》这样的老游戏,或者那些使用 Infinity 引擎的游戏只需要几兆 VRAM,而且看起来非常不错。

最佳答案

澄清一下,VBO 可以包含纹理坐标,但不知道将应用哪些纹理。

让 VBO 独立于纹理,并根据动画/帧索引计算片段/像素着色器中的纹理坐标。假设您的 VBO 中有四边形,然后您设置纹理坐标,以便它们只映射整个纹理。然后在着色器中,您将缩放并平移纹理坐标以在纹理图集中映射单个帧。然后,您可以将动画索引、图集中的帧数等作为统一值提供给着色器。

编辑(进一步澄清):

四边形的纹理坐标

(0,1)          (1,1)
x-------------x
| |
| |
| |
| |
| |
x-------------x
(0,0) (1,0)

这对应于将整个纹理映射到这个单个四边形。

假设您的纹理被方便地分割成 16x16“帧”,并在纹理图集中按行列顺序堆叠。因此,单帧的大小在 u 和 v 的纹理坐标中分别为 1/16。这是你的移动窗口。现在,在着色器中,您传递动画的“帧”编号,并且四边形中每个顶点的纹理坐标是按 16 缩放的纹理坐标,然后按帧进行平移(从 0 开始的整数):

float scale = 0.0625   // 1/16.
texCoord *= scale;
texCoord += float2(scale*frame%16, scale*(frame/16))

现在我只是凭空写下这篇文章,所以可能会有一些小错误。另外,此代码假设 texCoord 是四边形上片段的纹理坐标。请注意,计算 1/16 一次比重复除以 16(我可以添加每个像素)便宜得多。如果您还没有关注我,那么 float2(scale*frame%16,scale*(frame/16)) 行可能会令人困惑。更简单的情况:

(with a total of 64 frames in an 8x8 grid)
frame 0 1 2 3 4 5 6 7 8 9 10 11 12
x = frame%8 0 1 2 3 4 5 6 7 0 1 2 3 4
y = frame/8 0 0 0 0 0 0 0 0 1 1 1 1 1
(note integer division)

关于opengl - 具有多种纹理的 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7318509/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com