我使用的是SharpDX的11.2兼容版本,到目前为止渲染效果良好,但我开始用大纹理进行测试,需要mipmaping来避免高于屏幕分辨率的纹理产生难看的伪影。
据我所知,如果我想要完整的mipmap级别,我需要在纹理创建中将MipLevels设置为0,但是,将MipLevel参数从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),
}
由于纹理是不可变的,并且是用完整的MIP链创建的,因此需要为链中的每个MIP提供初始数据。我想你只是在为mip 0提供数据?
编辑:
这里也提出了类似的问题:http://www.gamedev.net/topic/605521-mipmap-dx11/
你有几个不同的选择:
1) 离线生成mip(可能将纹理存储在支持mip的DDS中),并提供一个DataRectangle数组,每个mip一个。
2) 删除Immutable用法标志,改为使用Default,不提供任何初始数据,而是在创建Mip 0后使用Map或UpdateSubresource之类的东西来填充Mip 0。填充mip 0后,只要使用D3D11_RESOURCE_MISC_GENERATE_MIPS MiscFlag创建纹理,就可以在DeviceContext上调用GenerateMips,这将使用正确的下采样数据填充所有其他mip。
3) 第三种方法是执行类似于选项2的操作,但您可以为除第一个mip之外的所有mip提供一组伪数据,从而避免调用Map或UpdateSubresource。但是,您仍然需要在DeviceContext上调用GenerateMips。