public void UpdateTexture(VoxelStorageContext context, ref IVoxelStorageTexture texture, Xenko.Graphics.PixelFormat pixelFormat, int layoutCount) { VoxelStorageTextureClipmap clipmap = texture as VoxelStorageTextureClipmap; if (clipmap == null) { clipmap = new VoxelStorageTextureClipmap(); } Vector3 ClipMapTextureResolution = new Vector3(ClipMapResolution.X, ClipMapResolution.Y * ClipMapCount * layoutCount, ClipMapResolution.Z); Vector3 MipMapResolution = new Vector3(ClipMapResolution.X / 2, ClipMapResolution.Y / 2 * layoutCount, ClipMapResolution.Z / 2); Vector3 MipMapNoLayoutResolution = new Vector3(ClipMapResolution.X / 2, ClipMapResolution.Y / 2, ClipMapResolution.Z / 2); if (NeedToRecreateTexture(clipmap.ClipMaps, ClipMapTextureResolution, pixelFormat)) { clipmap.ClipMaps = Xenko.Graphics.Texture.New3D(context.device, (int)ClipMapTextureResolution.X, (int)ClipMapTextureResolution.Y, (int)ClipMapTextureResolution.Z, new MipMapCount(false), pixelFormat, TextureFlags.ShaderResource | TextureFlags.UnorderedAccess); } if (NeedToRecreateTexture(clipmap.MipMaps, MipMapResolution, pixelFormat)) { if (clipmap.TempMipMaps != null) { for (int i = 0; i < clipmap.TempMipMaps.Length; i++) { clipmap.TempMipMaps[i].Dispose(); } } Vector3 MipMapResolutionMax = MipMapResolution; int mipCount = 1 + (int)Math.Floor(Math.Log(Math.Min(MipMapNoLayoutResolution.X, Math.Min(MipMapNoLayoutResolution.Y, MipMapNoLayoutResolution.Z)), 2)); clipmap.MipMaps = Xenko.Graphics.Texture.New3D(context.device, (int)MipMapResolution.X, (int)MipMapResolution.Y, (int)MipMapResolution.Z, new MipMapCount(true), pixelFormat, TextureFlags.ShaderResource | TextureFlags.UnorderedAccess); clipmap.TempMipMaps = new Xenko.Graphics.Texture[mipCount]; for (int i = 0; i < clipmap.TempMipMaps.Length; i++) { clipmap.TempMipMaps[i] = Xenko.Graphics.Texture.New3D(context.device, (int)MipMapResolutionMax.X, (int)MipMapResolutionMax.Y, (int)MipMapResolutionMax.Z, false, pixelFormat, TextureFlags.ShaderResource | TextureFlags.UnorderedAccess); MipMapResolutionMax /= 2; } } clipmap.MipmapInner = MipmapInner; clipmap.ClipMapResolution = ClipMapResolution; clipmap.ClipMapCount = ClipMapCount; clipmap.LayoutSize = layoutCount; clipmap.VoxelMatrix = InnerTextureMatrix; clipmap.VoxelSize = context.RealVoxelSize(); texture = clipmap; }