-1

我正在使用 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),
            }
4

1 回答 1

1

由于纹理是不可变的并且是使用完整的 MIP 链创建的,因此您需要为链中的每个 mip 提供初始数据。我假设您只为 mip 0 提供数据?

编辑:

这里提出了一个类似的问题:http: //www.gamedev.net/topic/605521-mipmap-dx11/

你有几个不同的选择:

1)离线生成mips(也许将纹理存储在支持mips的DDS中)并提供一个DataRectangles数组,每个mip一个。

2) 删除 Immutable 使用标志,改用 Default,不提供任何初始数据,而是在创建后使用 Map 或 UpdateSubresource 之类的东西来填充 Mip 0。一旦填充了 mip 0,只要使用 D3D11_RESOURCE_MISC_GENERATE_MIPS MiscFlag 创建纹理,就可以在 DeviceContext 上调用 GenerateMips,这将使用正确的下采样数据填充所有其他 mip。

3) 第三种方法是执行类似于选项 2 的操作,但您可以为除第一个 mip 之外的所有数据提供一组虚拟数据,从而避免调用 Map 或 UpdateSubresource。但是,您仍然必须在 DeviceContext 上调用 GenerateMips。

于 2014-01-04T10:28:57.523 回答