【发布时间】:2014-12-07 17:14:07
【问题描述】:
我目前正在为一个小游戏编写 2d 引擎。
我的想法是我可以在一次绘制调用中渲染整个场景。我认为我可以在四边形上渲染每个 2d 图像,这意味着我可以使用实例化。
我想象我的顶点着色器可能看起来像这样
...
in vec2 pos;
in mat3 model;
in sampler2d tex;
in vec2 uv;
...
我以为我可以像处理 VBO 一样在 gpu 上加载纹理并获取它的句柄,但似乎没那么简单。
看来我得打电话了
glActiveTexture(GL_TEXTURE0..N);
对于我要加载的每个纹理。现在这似乎不像我想象的那么容易编程。现代游戏引擎如何渲染多个纹理?
我读到GL_TEXTURE 的纹理限制取决于 GPU,但至少为 45。如果我要渲染包含超过 45 个纹理的图像,例如 90,该怎么办?
看来我必须渲染前 45 个纹理并从 gpu 中删除所有纹理并将其他 45 个纹理从 hdd 加载到 gpu。每一帧都做这似乎不太合理。特别是当我想为 2D 图像制作动画时。
我可以很容易地认为,一个简单的 2d 角色动画可能包含 10 个不同的图像。这意味着我可以轻松超过纹理限制。
我的一个小想法是将多个图像组合成一个巨型图像,然后通过 uv 坐标偏移它们。
我想知道我是否误解了纹理在 OpenGL 中的工作原理。
如何在 OpenGL 中渲染多个纹理?
【问题讨论】:
-
不需要删除旧贴图,绑定新贴图即可。还有纹理图集
-
你的“小创意”其实是一种很常见的技巧,在很多游戏中都有使用。 GPU 非常擅长处理大型纹理。
-
我似乎记得很多类似的问题,但我现在找不到重复的问题。你所有的纹理大小都一样吗?您在最后提到的想法主要被称为“纹理图集”,并且是其中一种选择。
-
其实Texture Image Units的数量至少不是45个。它的最小值精确地等于16 * 现代 OpenGL 中的
。这意味着在 GL 3.3 中它是 16 * 3 (Vertex, Geometry, Fragment) = 48,在 GL 4.5 中它是 16 * 5 (Vertex, Tessellation Control, Tessellation Evaluation, Geometry, Fragment) = 80。这样做的原因是您可以绑定一组 16 个独特的纹理以供每个阶段使用,但实际上在最小实现中的着色器的一次执行中不能采样超过 16 个纹理。 -
我已经在这里发布了答案:stackoverflow.com/questions/16075791/…
标签: opengl