Kle*_*ine 14 android textures opengl-es
This is just a quick question before I dive deeper into converting my current rendering system to openGL. I heard that textures needed to be in base 2 sizes in order to be stored for rendering. Is this true?
My application is very tight on memory, but most of the bitmaps are not powers of two. Does storing non-base 2 textures consume more memory?
Mat*_*gro 10
这取决于OpenGL ES版本,OpenGL ES 1.0/1.1具有两个限制的强大功能.OpenGL ES 2.0没有这个限制,但是它限制了两个纹理的非幂的包裹模式.
创建更大的纹理以匹配POT尺寸会浪费纹理内存.
小智 6
Suresh,在计算机图形学(非常)早期的计算机图形学之前(在经济实惠的硬件加速之前)内置于OpenGL中的2限制的强大功能,并且它是出于性能原因而完成的.当低级渲染代码可以针对2次幂纹理进行硬编码时,它可以获得不错的性能提升.即使在现代GPU中,POT纹理也比NPOT纹理更快,但速度差异比以前小得多(尽管在许多ES设备上它仍然可能很明显).
GuyNoir,你应该做的是建立一个纹理图集.我上周末为自己的Android游戏解决了这个问题.我创建了一个名为TextureAtlas的类,它的构造函数调用glTexImage2D()来创建我选择的任何大小的大纹理(为像素值传递null).然后我可以调用add(id,bitmap),它重复调用glTexSubImage2D()来打包更小的图像.TextureAtlas类跟踪较大纹理中的已用空间和自由空间以及存储每个位图的矩形.然后渲染代码可以调用get(id)来获取图集中图像的矩形(然后它可以转换为纹理)坐标).
旁注#1:选择打包各种纹理尺寸的最佳方法并非易事.我选择从TextureAtlas类中的简单逻辑开始(想想打字机+回车+换行)并确保以最佳顺序加载图像以利用该逻辑.在我的情况下,那是从最小的正方形图像开始,然后一直到中等方形图像.然后我加载任何短+宽图像,强制CR + LF,然后加载任何高+瘦图像.我最后加载了最大的square-ish图像.
侧注#2:如果您需要多个纹理图集,请尝试将每个图像内部的图像分组,以最大限度地减少切换纹理所需的次数(这可能会导致性能下降).例如,在我的Android游戏中,我将所有静态游戏板元素放入一个地图册,并将各种动画效果的所有帧放在第二个地图集中.这样我就可以绑定图集#1并在游戏板上绘制所有内容,然后我可以绑定图集#2并在其上绘制所有特效.每帧两个纹理选择非常有效.
侧注3:如果你需要重复/镜像纹理,他们需要进入自己的纹理,你需要缩放它们(不要添加黑色像素来填充边缘).
归档时间: |
|
查看次数: |
13704 次 |
最近记录: |