use*_*458 4 java android textures libgdx texturepacker
尝试在(令人敬畏的)LibGDX框架中了解纹理包装,我需要帮助.
我想绑定一个纹理(根据网格,颜色和纹理),该纹理是从TexturePacker打包的TextureAtlas中提取的.纹理绑定到矩形网格.
我希望纹理(纹理的实例)基本上从打包文件中提取.
是否可以使用createsprite或findregion方法并以某种方式跳过文件句柄步骤?
另外:将上述方法与AssetManager结合使用时,应该记住哪些特殊内容?
谢谢你把我排除在外!
P.T*_*.T. 10
首先,TextureAtlas通过指向描述图集的文本文件来创建对象(创建图集的工具将创建两个文件:图像和描述其内容的文本文件):
TextureAtlas myTextures = new TextureAtlas("images/packed.txt");
Run Code Online (Sandbox Code Playgroud)
然后你可以查看TextureRegion该地图集(即地图集的特定子纹理).该区域应该具有所使用的原始文件的基本名称(如果您遵循一些特殊的命名约定来创建纹理元素数组,则有更多细节和选项,但现在暂时关闭它):
TextureRegion region = myTextures.findRegion(fname);
Run Code Online (Sandbox Code Playgroud)
要在网格上绘制此纹理区域,您需要初始化Mesh对纹理坐标的支持:
Mesh myMesh = new Mesh(...,
new VertexAttribute(Usage.TextureCoordinates, 2, "y"));
Run Code Online (Sandbox Code Playgroud)
该new VertexAttribute(Usage.TextureCoordinates, 2, ...)告诉libGDX,这个网格将有每个顶点的两个纹理坐标(传统上,这两个纹理坐标被称为u和v).每个顶点可以有一堆不同的属性,但我将假设唯一的其他属性是Usage.Positionx,y,z空间坐标的3值.
现在,在定义网格(您传递给的数组)的浮点数组中,setVertices您需要设置x,y和z空间坐标加上u和每个顶点的v纹理坐标:
final int floatsPerVertex = 5; // 3 spatial + 2 texture
float[] meshData = new float[numVerticies * floatsPerVertex];
for (int i = 0; i < numVerticies; i++) {
meshData[(i * floatsPerVertex) + 0] = ... ; // x coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 1] = ... ; // y coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 2] = ... ; // z coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 3] = ... ; // u texture coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 4] = ... ; // v texture coordinate of i'th vertex
}
myMesh.setVertices(meshData);
Run Code Online (Sandbox Code Playgroud)
你可以计算出正确的u和v特定TextureRegion使用getU,getV,getU2,和getV2方法.请注意,纹理坐标在左上角有原点(u1,v1),y轴在"向下"点(OpenGL中的屏幕和空间坐标通常在左下角和y轴点有原点)上").它有点复杂,但非常灵活,因为它可以在纹理映射到网格上时翻转或拉伸或扭曲纹理.
由于纹理很大(例如512x512)并且特定区域是其中的一小部分(例如,在128x128处为20x20),实际上最终会给出网格纹理坐标,其仅利用整个512x512图像的20x20子集.
最后,渲染时需要绑定图像,并在渲染之前启用纹理:
region.getTexture().bind();
Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D);
myMesh.render();
Gdx.graphics.getGL10().glDisable(GL10.GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
请注意,这比它应该效率低得多.纹理图集的部分好处是它应该包含许多可以一起渲染的区域,因此您只需要绑定一个纹理,然后从该一个绑定纹理渲染许多不同的纹理网格.
SpriteBatch支持用a定义的sprite,TextureRegion并AssetManager支持加载和查找TextureAtlas作为第一类元素.
| 归档时间: |
|
| 查看次数: |
7132 次 |
| 最近记录: |