Как создать MipMaps в SharpDX Toolkit (2.5)
Я использую SharpDX-Toolkit и не могу создавать изображения на Texture2D. Если я загружаю текстуру с помощью диспетчера контента и пытаюсь вызвать GenerateMipMaps(), я получаю исключение NotSupportedException:
Невозможно создать mipmaps для этой текстуры (Должно быть RenderTarget и ShaderResource и MipLevels > 1
Код (в LoadContent-методе Game-Class):
Texture2D texture = this.Content.Load<Texture2D>("MyTexture");
texture.GenerateMipMaps(this.GraphicsDevice); <- Exception thrown in this line
Я не знаю, что делать, и я надеюсь, что кто-нибудь может мне помочь с этим вопросом. Благодарю.
1 ответ
С помощью:
Texture2D texture = this.Content.Load<Texture2D>("MyTexture");
Будет использовать текстуру по умолчанию "Immutable" и разрешит только привязку в виде Shader View.
Для создания MipMaps необходимо использовать Default и Binding в качестве ShaderView/RenderView.
Теперь у вас есть несколько вариантов:
1 / Предварительно обработайте ваши текстуры как dds с помощью mipmaps, загрузчик примет это во внимание.
TexConv может сделать это для вас. (используйте -m, чтобы указать количество уровней).
2 / Загрузите вашу текстуру, как указано выше, создайте вторую текстуру, используя
Texture2D texturewithmips = Texture2D.New(device, texture.Width, texture.Height, MipMapCount.Auto, texture.Format,
TextureFlags.ShaderResource | TextureFlags.RenderTarget,
1,Direct3D11.ResourceUsage.Default);
Теперь вам нужно скопировать первый MIP, используя:
device.Copy(texture, 0, null, t2, 0);
Теперь вы можете использовать:
t2.GenerateMipMaps(this.GraphicsDevice);
3 / Поскольку вышеописанным способом вы как бы теряете менеджер контента (с авто кешами для вас).
Вы можете изменить класс TextureContentReader, чтобы сделать это для вас, добавив дополнительные параметры для загрузки текстуры.
Если вам нужна дополнительная помощь, не стесняйтесь.