我正在使用SharpDX的11.2兼容版本并且到目前为止渲染效果不错,但是我开始用大纹理测试,并且需要mipmaping以避免高于屏幕分辨率纹理的丑陋伪像。
根据我的理解,如果我想要全套的mipmap级别,我需要在纹理创建中将MipLevels设置为0,但是,将MipLevels参数从1(它是什么和工作)更改为0(我的目标)会导致纹理实例化行上带有无效参数的异常。
错误必须在那一点或之前(在它到达任何渲染之前和声明步骤之前崩溃)。
以下是我如何声明纹理状态:
new SharpDX.Direct3D11.Texture2DDescription()
{
Width = bitmapSource.Size.Width,
Height = bitmapSource.Size.Height,
ArraySize = 1,
BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource,
Usage = SharpDX.Direct3D11.ResourceUsage.Immutable,
CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
MipLevels = 1, // This works, but if i change it to 0, i get an argument invalid exception
OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
}
答案 0 :(得分:1)
由于纹理是不可变的并且是使用完整的MIP链创建的,因此您需要为链中的每个mip提供初始数据。我假设你只提供mip 0的数据?
编辑:
此处提出了类似的问题:http://www.gamedev.net/topic/605521-mipmap-dx11/
您有几种不同的选择:
1)离线生成mips(可能将纹理存储在支持mips的DDS中)并提供DataRectangles数组,每个mip一个。
2)删除不可变使用标志,改为使用默认值,不提供任何初始数据,而是使用Map或UpdateSubresource之类的东西在创建后填写Mip 0。填充mip 0后,只要纹理是使用D3D11_RESOURCE_MISC_GENERATE_MIPS MiscFlag创建的,就可以在DeviceContext上调用GenerateMips,这将使用正确的下采样数据填充所有其他mips。
3)第三种方法是做类似于选项2的操作,但是你可以为除第一个mip之外的所有数据提供一组虚拟数据,从而避免调用Map或UpdateSubresource。但是,您仍然需要在DeviceContext上调用GenerateMips。