我目前正在为小型游戏编写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中渲染多个纹理?
这个问题有点笼统,所以这只是在同一绘制调用中使用多个纹理的一些选项的快速概述。
对于这种方法,可以使用典型序列将每个纹理绑定到不同的纹理单元:
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, tex[i]);
在着色器中,可以有一堆单独的sampler2D
制服,也可以有一系列sampler2D
制服。
这样做的主要缺点是,您受到可用纹理单元数量的限制。
您可以使用数组纹理。这是通过使用GL_TEXTURE_2D_ARRAY
纹理目标来完成的。在许多方面,2D纹理阵列类似于3D纹理。它基本上是一堆相互堆叠的2D纹理,并存储在单个纹理对象中。
缺点是所有纹理都必须具有相同的大小。如果不这样做,则必须使用最大的大小作为纹理数组的大小,而浪费内存用于较小的纹理。如果大小不尽相同,则还必须将缩放比例应用于纹理坐标。
这就是您已经提出的想法。您将所有纹理存储在单个大纹理中,并使用纹理坐标来控制使用哪个纹理。
尽管这是一种流行的方法,但是这存在一些技术挑战。您必须注意纹理之间的接缝,以免在使用线性采样时它们不会相互渗出。尽管这种方法与纹理阵列不同,但可以在不浪费内存的情况下允许使用不同的纹理大小,但在地图集内分配可变大小的区域会变得有些棘手。
到目前为止,仅作为扩展提供:ARB_bindless_texture。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句