如何在现代OpenGL中渲染多个纹理?

迈克·克莱因(Maik Klein)

我目前正在为小型游戏编写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中渲染多个纹理?

雷托·科拉迪(Reto Koradi)

这个问题有点笼统,所以这只是在同一绘制调用中使用多个纹理的一些选项的快速概述。

绑定到多个纹理单元

对于这种方法,可以使用典型序列将每个纹理绑定到不同的纹理单元:

glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, tex[i]);

在着色器中,可以有一堆单独的sampler2D制服,也可以有一系列sampler2D制服。

这样做的主要缺点是,您受到可用纹理单元数量的限制。

阵列纹理

您可以使用数组纹理。这是通过使用GL_TEXTURE_2D_ARRAY纹理目标来完成的在许多方面,2D纹理阵列类似于3D纹理。它基本上是一堆相互堆叠的2D纹理,并存储在单个纹理对象中。

缺点是所有纹理都必须具有相同的大小。如果不这样做,则必须使用最大的大小作为纹理数组的大小,而浪费内存用于较小的纹理。如果大小不尽相同,则还必须将缩放比例应用于纹理坐标。

纹理图集

这就是您已经提出的想法。您将所有纹理存储在单个大纹理中,并使用纹理坐标来控制使用哪个纹理。

尽管这是一种流行的方法,但是这存在一些技术挑战。您必须注意纹理之间的接缝,以免在使用线性采样时它们不会相互渗出。尽管这种方法与纹理阵列不同,但可以在不浪费内存的情况下允许使用不同的纹理大小,但在地图集内分配可变大小的区域会变得有些棘手。

无边界的纹理

到目前为止,仅作为扩展提供:ARB_bindless_texture

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用现代OpenGL渲染纹理

来自分类Dev

如何在Android的OpenGL ES中渲染深度纹理

来自分类Dev

如何在OpenGL 3.1中正确渲染为纹理

来自分类Dev

如何在OpenGL ES 2.0中管理多个纹理?

来自分类Dev

如何渲染多个纹理?

来自分类Dev

使用lwjgl在现代OpenGL中绘制纹理

来自分类Dev

如何使用GLSL在现代OpenGL中渲染文本

来自分类Dev

如何在OpenGL中正确正交渲染纹理?

来自分类Dev

在OpenGL中渲染到纹理

来自分类Dev

如何在OpenGL中构造glutSolidTorus的纹理?

来自分类Dev

如何在OpenGL中反转纹理颜色

来自分类Dev

如何在OpenGL中处理纹理动画?

来自分类Dev

如何在python-moderngl中渲染具有不同纹理的多个对象

来自分类Dev

具有多个纹理的OpenGL渲染

来自分类Dev

在现代OpenGL中渲染大圆形点

来自分类Dev

现代OpenGL问题纹理平面

来自分类Dev

纹理在OpenGL中的渲染非常奇怪

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

在OpenGL中渲染纹理1到1

来自分类Dev

在OpenGL中以1到1渲染纹理

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

如何在C#中渲染鼠标光标纹理?

来自分类Dev

如何在Swift中通过OpenGL显示RGB纹理?

来自分类Dev

如何在SDL2中显示OpenGL纹理

来自分类Dev

如何在OpenGL中在对象上放置纹理?

来自分类Dev

如何在Swift中通过OpenGL显示RGB纹理?

来自分类Dev

如何在 Android 的 OpenGL ES 2.0 中检查上传的纹理?

来自分类Dev

在“直接渲染到纹理”后如何在不影响纹理的情况下渲染到FBO中

来自分类Dev

如何在OpenGL中与其他现有纹理一起创建纹理图集?