OpenGL ES可以渲染非基本2维的纹理吗?

在深入研究将当前渲染系统转换为openGL之前,这只是一个简单的问题。 我听说纹理需要在基础2的大小,以便存储渲染。 这是真的?

我的应用程序在内存上非常紧张,但大多数位图不是两个幂。 存储非基础2纹理消耗更多的内存?

Solutions Collecting From Web of "OpenGL ES可以渲染非基本2维的纹理吗?"

这取决于OpenGL ES版本,OpenGL ES 1.0 / 1.1有两个限制的function。 OpenGL ES 2.0没有这个限制,但是它限制了两个纹理非功率的包装模式。

创build更大的纹理以匹配POT尺寸会浪费纹理内存。

苏雷什(Suresh),在计算机graphics学的早期(在负担得起的硬件加速之前),OpenGL内置了2个限制的function,并且是出于性能原因而完成的。 当低级渲染代码可以被硬编码为二次幂纹理时,性能会得到不错的提升。 即使在现代GPU中,POT纹理也比NPOT纹理更快,但速度差异比以前小得多(虽然它在许多ES设备上仍然可以注意到)。

GuyNoir,你应该做的是build立一个纹理图集。 上个周末我刚刚自己解决了这个问题,用于我自己的Android游戏。 我创build了一个名为TextureAtlas的类,其构造函数调用glTexImage2D()来创build我select的任意大小的大纹理(为像素值传递null)。 然后我可以调用add(id,bitmap),它调用glTexSubImage2D(),重复打包在较小的图像。 TextureAtlas类跟踪较大纹理内的已用空间和空闲空间,以及每个位图存储在其中的矩形。然后,渲染代码可以调用get(id)来获取地图集中图像的矩形(然后可以将其转换为纹理坐标)。

附注#1:select用各种纹理尺寸打包的最佳方法并不是一件容易的事情。 我select从TextureAtlas类中的简单逻辑开始(认为打字机+回车+换行),并确保按最佳顺序加载图像以利用该逻辑。 就我而言,就是从最小的方形图像开始,一直到中等方形的图像。 然后我加载任何短+宽图像,强制CR + LF,然后加载任何高+皮包骨头的图像。 我最后加载最大的方形图像。

附注#2:如果您需要多个纹理地图集,请尝试将每个渲染在一起的图像进​​行分组,以尽量减less需要切换纹理的次数(这可能会导致性能下降)。 例如,在我的Android游戏中,我将所有静态游戏棋盘元素放在一个地图集中,并将所有animation效果的所有帧放在另一个地图集中。 这样,我可以绑定地图集#1,并在游戏板上绘制所有东西,然后我可以绑定地图集#2并在其上绘制所有特效。 每帧两个纹理select非常有效。

附注#3:如果你需要重复/镜像纹理,他们需要进入他们自己的纹理,你需要缩放(不添加黑色像素填充边缘)。

不,它必须是2base。 但是,您可以通过在图像的顶部和/或底部添加黑条来解决此问题,然后使用纹理坐标数组来限制纹理将从图像映射到的位置。 例如,可以说你有一个13×16像素的纹理。 您可以在右侧添加3个黑色像素,然后执行以下操作:

static const GLfloat texCoords[] = { 0.0, 0.0, 0.0, 13.0/16.0, 1.0, 0.0, 1.0, 13.0/16.0 }; 

现在,你有一个2base的图像文件,但没有2base的纹理。 只要确保你使用线性缩放:)

这有点迟,但OpenGL ES 1/2通过扩展支持2种非功率纹理。

主要的是GL_OES_texture_npot 。 iOS设备也有GL_IMG_texture_npot和GL_APPLE_texture_2D_limited_npot

通过调用glGetString(GL_EXTENSIONS)并search所需的扩展来检查这些扩展。

我还build议保持你的纹理尺寸是4的倍数,因为有些硬件拉伸纹理,如果不是。