Articles of texture atlas

何时调用GLBindTexture时,使用恶意表?

最初,我为我的精灵的animation使用了单独的纹理(即单个的.png文件),并最近更改了我的代码,以便我可以将所有的animation帧放到1个文件中(所以它基本上就像是一个迷你精灵表 – 迷你',因为我使用每个精灵1个文件,我没有使用1个文件我所有的精灵)。 无论如何,我的问题涉及glBindTexture 。 最初,当我想更新animation帧时,我正在切换纹理,所以在我的精灵的绘制方法中调用它: GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texID); //texID being the texture ID 但是,现在发生的是我找出纹理偏移量,并指向我需要的纹理的一部分。 纹理本身不会改变,所以每次画图时我都需要这一行吗? 我尝试从我的draw()方法中删除线条,并在最初加载纹理时调用它,但是精灵没有使用正确的纹理进行绘制,而是使用完全不同的非相关纹理。 那么在使用精灵表的情况下,正确的行为是什么呢? 目前,我不知道为什么这会比使用单个文件和每帧切换纹理更快。 事实上,由于我现在不得不计算纹理偏移量(而之前它是固定的),所以会有更多的开销。 所以我猜测这个优势来自于每次绘制时都不需要调用这个glBindTexture线(因为它很昂贵)。 那么如何正确地select纹理来分配给这个精灵,而不是在绘制方法中呢? 任何帮助将不胜感激,如果你需要代码请问我没有发布我的整个绘制方法,因为我不认为有必要解释这个问题。 这是我以前做的事情 Bind texture 1 (Animation frame 1, textures 1-8 belong to this sprite) Draw Sprite 1 Bind texture 9 Draw Sprite 2 重复绑定纹理2,然后3等等的精灵1animation 我现在使用一个包含所有8个animation帧的sprite1纹理 Bind texture 1 (all frames) Draw Sprite 1 (pointing […]

为什么一些纹理在GDX中变黑

我在GDX游戏中有这样的情况:我有一个静态类来管理我的Drawables 。 这是一个单身人士。 我想加载我所有的Textures ,以便在屏幕之间切换时不加载它们(我知道这是不好的做法,但我需要这个)。 我将我的资源打包到一个TextureAtlas中并加载它们。 但是,当我打包并加载更多的一些Textures并尝试使用它们中的一些变黑。 为什么会发生? 我怎么能绕过这个不幸的情况。 我的TextureAtlas(四个图像和一个.txt文件)的大小约为4MB。

使用texturepacker2创建一个触摸板 – 操纵杆

我正在添加一个触摸板控件到我的游戏中,使用TexturePacker将图像加载到image-atlas 。 我已经按照这个教程来添加游戏杆。 除了加载资产部分,一切都是一样的。 这是我如何添加控件: //in create ta = new TextureAtlas(Gdx.files.internal("image-atlases/pages-info.atlas")); camera = new OrthographicCamera(); camera.setToOrtho(false, 800, 480); batch = new SpriteBatch(); blockSpeed = 5; InitTouchPad(); //create a stage and add touchpad stage = new Stage(800, 480,true, batch); stage.addActor(touchpad); Gdx.input.setInputProcessor(stage); //create block sprite blockTextureRegion = ta.findRegion("block"); blockSprite = new Sprite(blockTextureRegion); //set position to the left […]

如何水平地翻转不同尺寸的精灵?

我正在用TexturePacker打包的这个纹理图集在HTML5 Canvas上制作一个animation: 当角色面向右侧时,它会很好运作。 我试着水平翻转它,但是得到错误的位置: 这是我现在的代码,每帧都有一个偏移值来修复位置: <canvas id="c" width="200" height="100" style="background: #000"></canvas> var metaData = [ {x:0,y:0,w:35,h:38,offsetX:3,offsetY:9}, {x:37,y:0,w:31,h:37,offsetX:6,offsetY:10}, {x:70,y:0,w:65,h:47,offsetX:0,offsetY:1}, {x:137,y:0,w:65,h:47,offsetX:0,offsetY:1}, {x:204,y:0,w:61,h:46,offsetX:1,offsetY:1}, {x:267,y:0,w:42,h:46,offsetX:1,offsetY:1}, {x:311,y:0,w:43,h:44,offsetX:1,offsetY:3}, {x:356,y:0,w:38,h:37,offsetX:6,offsetY:10}, {x:396,y:0,w:35,h:34,offsetX:6,offsetY:13}, {x:433,y:0,w:33,h:37,offsetX:7,offsetY:10}, {x:468,y:0,w:36,h:40,offsetX:5,offsetY:7}, {x:506,y:0,w:34,h:39,offsetX:6,offsetY:8} ], dx = 0, //position x dy = 0, //position y index = 0; //frame index (function draw() { context2D.clearRect(0,0,c.width,c.height); var cur = metaData[index]; if(facingRight) { context2D.drawImage( img, […]

VAO和纹理坐标体素渲染的最佳策略?

我正在做一个游戏,用OpenGL渲染大量的立方体(体素)。 所有的立方体都具有相同的几何形状(所以我可以重新使用顶点位置VBO),并使用一个单一的精灵板材纹理。 这意味着纹理坐标将不得不根据所使用的精灵来改变立方体。 立方体的所有六边将使用相同的精灵(换言之,相同的纹理坐标)。 现在,用现代的OpenGL渲染器来解决这个问题的最佳策略是什么? 我提出了两种可能性: 创建与精灵表中的立方体精灵一样多的VAO。 将相同的顶点位置VBO绑定到它们全部,但是不同的纹理坐标VBO(根据要显示的纹理的sprite /部分)。 在我的具体情况下,这将产生大约600个不同的纹理坐标的VBO,因此600个VAO。 只创建一个VAO。 以通用的方式设置纹理坐标VBO(例如0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 )。 在渲染循环中,将实际纹理坐标(只有4个值)作为统一variables发送给着色器。 在着色器中,可以使用通用的纹理坐标来确定应该使用统一的四个值中的哪两个。 还有其他的可能性,我错过了? 什么是最好的performance?

PoT spritesheed内的精灵需要PoT吗?

我使用TexturePackerGUI来创建PoT spritesheets。 但是spritesheet里面的精灵还需要PoT吗? 如果他们需要,我是否需要禁用修整? 我使用的框架是libGDX。

在textureregion中找不到图像

以前,我使用简单的Texture来创建基于Sprite的animation,但是它没有提供对图像的支持。TexturePacker提供了一次加载所有图像的能力,然后从图像中获取所需的图像。 这就是说,我遵循了Libgdx wiki上的几个教程,直到加载部分运行良好。 但是我想在渲染过程中会造成一些问题。 这是我如何将图像加载到我的桌​​面项目中的texturepacker : private static final String INPUT_DIR = "../Drop-Android/assets/images"; private static final String OUTPUT_DIR = "../Drop-Android/assets/image-atlases"; private static final String PACK_FILE = "pages-info"; public static void main(String[] args){ LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); cfg.title = "Drop"; cfg.width = 800; cfg.height = 480; Settings settings = new Settings(); settings.maxWidth = 512; settings.maxHeight […]

使用OpenGL ES 2.0批量处理2D纹理

我有一个纹理地图集和Sprite批处理的OpenGLES 2.0 2D游戏我正在开发哪个工作正常,但我有深度sorting问题。 我使用地图集来减less纹理绑定操作的数量,而精灵批量可以减less绘制调用的次数,而且一切都很好,但是在如何在游戏中安排精灵时,我遇到了合理的问题。 因为与批处理一起使用图集的全部要点是保存绑定/绘制调用,所以我inheritance了一个限制,我无法在跨多个地图集的纹理相同的批处理中绘制精灵。 这意味着我必须仔细思考2D精灵的zsorting。 如果精灵“A”应该位于精灵“B”的后面,那么我必须首先绘制精灵A的批处理。 当有三个精灵,A,B和C,其中A在B之后,而B在C之后,但是A和C在同一个地图集时,问题就出现了。 那是, Atlas 1 ——— | A | C | ——— Atlas 2 —– | B | —– Scene ———————– [CAMERA] -> C -> B -> A 现在很明显,我可以通过多个绑定/批量操作来实现这一点,但是这样做首先会破坏它的目的。 理想情况下,我不想考虑哪个精灵在哪个地图集上,只是改变精灵的“z”值。 我尝试了启用GL_DEPTH_TEST,但我的大部分精灵都使用具有一定透明度的纹理,所以这对我不起作用。 有没有一个“标准”的方法呢? 还是我把自己画到了一个我不应该拥有的角落?

与紫外纹理图谱撕裂的纹理

下面的代码将贴图从纹理贴图映射到UV。 问题是我有纹理撕裂的问题。 有谁知道如何克服这个问题,并有任何建议? 这里是我有的代码,所有的图像点过滤,并没有使用mipmapping 。 for (int i = 0; i < mesh.uv.Length; i++) { UVs.Add(GetUVTextureFromAtlas(mesh.uv[i].x, mesh.uv[i].y, voxel, 0)); } […] Vector2 GetUVTextureFromAtlas(float x, float y, ushort voxel, Facing side) { Rect rect = GetVoxelTextureRect(voxel, side); float xout = UVLerp(rect.x, rect.x + rect.width, x); float yout = UVLerp(rect.y, rect.y + rect.height, y); return new Vector2(xout, […]

构建包括精灵包装图集和它的原始纹理

我使用Unity的Sprite Packer,效果很好。 但是,当我查看构建报告(在Editor.log中)时,结果通常包括生成的地图集纹理和原始纹理。 浪费太多空间。 我检查了解压缩APK的大小,生成报告是正确的。 我尝试了几个configuration(添加和删除纹理),但我找不到任何规则。 一些观察: – 只有在可变尺寸的地图集中使用25个以上的纹理时,我才能重现这一点。 – 纹理压缩设置并不重要。 分组策略可以修改结果,但是没有解决问题。 有没有人有类似的经验? 如有必要,我可以上传我的testing项目。