/// <summary> /// Add a texture into the atlas. /// </summary> public bool AddTexture(CommandBuffer cmd, out Vector4 scaleOffset, Texture texture) { int key = texture.GetInstanceID(); if (!m_AllocationCache.TryGetValue(key, out scaleOffset)) { int width = texture.width; int height = texture.height; if (m_AtlasAllocator.Allocate(out scaleOffset, key, width, height)) { scaleOffset.Scale(new Vector4(1.0f / m_Width, 1.0f / m_Height, 1.0f / m_Width, 1.0f / m_Height)); for (int mipLevel = 0; mipLevel < (texture as Texture2D).mipmapCount; mipLevel++) { cmd.SetRenderTarget(m_AtlasTexture, mipLevel); Blitter.BlitQuad(cmd, texture, new Vector4(1, 1, 0, 0), scaleOffset, mipLevel, false); } m_AllocationCache.Add(key, scaleOffset); return(true); } else { return(false); } } return(true); }
void BlitOctahedralTexturePadding(CommandBuffer cmd, Vector4 scaleOffset, Texture texture, Vector4 sourceScaleOffset, bool blitMips = true) { int mipCount = GetTextureMipmapCount(texture.width, texture.height); int pixelPadding = GetTexturePadding(); Vector2 textureSize = GetPowerOfTwoTextureSize(texture); bool bilinear = texture.filterMode != FilterMode.Point; if (!blitMips) { mipCount = 1; } using (new ProfilingScope(cmd, ProfilingSampler.Get(CoreProfileId.BlitTextureInPotAtlas))) { for (int mipLevel = 0; mipLevel < mipCount; mipLevel++) { cmd.SetRenderTarget(m_AtlasTexture, mipLevel); Blitter.BlitOctahedralWithPadding(cmd, texture, textureSize, sourceScaleOffset, scaleOffset, mipLevel, bilinear, pixelPadding); } } }