Skip to content

Latest commit

 

History

History
67 lines (46 loc) · 3.45 KB

TextureAtlas.md

File metadata and controls

67 lines (46 loc) · 3.45 KB

TextureAtlas


mc在游戏加载期间,讲大量分散的贴图合并,用于Batched Render,加速渲染
代码上对应类net.minecraft.client.renderer.texture.TextureAtlas
本身即继承自AbstractTexture,证明其本身也是一张图片,这里列出atlas/blocks

而自身含有大量分散的贴图,则被抽象为TextureAtlasSprite,从中可以拿到u0,u1,v0,v1
类型为float,表明其已是经过标准化的uv坐标

TextureAtlas内有字段Map<ResourceLocation, TextureAtlasSprite> texturesByName
key为材质对应的ResourceLocation

部分TextureAtlasAtlasSet所引用,而每一个TextureAtlas也有一个ResourceLocation作为其表征
因此,AtlasSet可被视为Map<ResourceLocation<Map<ResourceLocation,TextureAtlasSprite>>

TextureAtlas stored by AtlasSet field name
minecraft:textures/atlas/blocks BLOCK_ATLAS/LOCATION_BLOCKS
minecraft:textures/atlas/signs SIGN_SHEET
minecraft:textures/atlas/banner_patterns BANNER_SHEET
minecraft:textures/atlas/shield_patterns SHIELD_SHEET
minecraft:textures/atlas/chest CHEST_SHEET
minecraft:textures/atlas/beds BED_SHEET
minecraft:textures/atlas/shulker_boxes SHULKER_SHEET

其余部分的被TextureAtlasHolder的实现者持有

TextureAtlas owner
minecraft:textures/atlas/mod_effects MobEffectTextureManager
minecraft:textures/atlas/paintings PaintingTextureManager

例外

TextureAtlas owner
minecraft:textures/atlas/particles ParticleEngine

可通过Minecraft类下Function<ResourceLocation, TextureAtlasSprite> getTextureAtlas(ResourceLocation pLocation)拿到所需TextureAtlasSprite

add

mc会将被引用的材质自动添加,若想手动添加

可订阅TextureStitchEvent.Pre
通过getAtlas()拿到TextureAtlas,若对其添加TextureAtlasSprite,可调用addSprite(ResourceLocation)

animate texture

TextureAtlas实现了net.minecraft.client.renderer.texture.Tickable
最终会调用TextureAtlasSprite$AnimatedTexture#tick,内部调用glPixelStorei

利用TextureAtlasHolder实现动态盔甲纹理

forge为item添加了如下方法default String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type)
通过这个方法,可实现为盔甲指定纹理,然而mc在渲染盔甲时,与渲染方块不同,并不使用类似于Atlas,而是直接使用纹理文件作为目标,此过程.mcmeta中指定的动画内容无效
可通过委托TextureAtlasHolder,利用它帮助解析.mcmeta文件,然后手动移除mc在TextureAtlas#getLoadedSprites添加的MissingTextureAtlasSprite
并且手动设置纹理大小,则在复写forge添加的返回的方法中,返回TextureAtlasHolder持有的TextureAtlas对象的ResourceLocation即可

注意TextureAtlasHolder#getSprite会修改你在getResourcesToLoad中提交的的委托的纹理路径

Example:
animated_model