【问题标题】:Directx 11.2 mipmaps with SharpDX?Directx 11.2 mipmaps 与 SharpDX?
【发布时间】:2014-01-04 01:25:58
【问题描述】:

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

【问题讨论】:

  • 如果你关注sharpdx.com/forum/4-general/…,你应该能够自己诊断
  • 我只是按照这些步骤操作(打开本机调试并使用调试标志创建设备)。我仍然得到相同的结果,一个 SharpDXException 说明我的参数不正确。
  • 即使按照这些步骤,我也没有在输出窗口中得到任何东西(如果重要的话,我正在使用 VS 2013)
  • 好吧,不确定发生了什么,但本机调试再次未选中,重新检查,但它抱怨缺少 nvumdshimx.dll,所以我认为我缺少能够正确调试的东西?
  • 通过进入反汇编视图并跳过该行(它在错误之前),设法跳过丢失的 pdb,但是我从附加输出中得到的一切都是无用的:D3D11 错误:ID3D11Device::CreateTexture2D:返回 E_INVALIDARG,表示传递了无效参数。 [STATE_CREATION 错误 #104:CREATETEXTURE2D_INVALIDARG_RETURN]

标签: graphics rendering directx-11 sharpdx mipmaps


【解决方案1】:

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

编辑:

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

您有几个不同的选择:

1) 离线生成 mip(也许将纹理存储在支持 mip 的 DDS 中)并提供一个 DataRectangle 数组,每个 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。

【讨论】:

  • 通过谷歌搜索 DX11 mipmap 找不到太多信息,但我认为通过您的回答获得 mipmap 需要的不仅仅是设置 mipmap 级别。是的,我只加载一个普通的常规纹理,从平面纹理开始时获得 mipmap 的适当方法是什么? (我不想在运行时更新它,所以我想坚持不可变)
  • 我在对原始答案的编辑中添加了一些额外信息,如果您需要更多信息,请告诉我。
  • 是的,这很有帮助,谢谢。是否可以将纹理“转换”为不可变或从纹理创建纹理? (我可以使用解决方案 2,然后以某种方式摆脱该纹理,转而使用预先生成 mips 的不可变纹理吗?)。谢谢!
  • 我不会太在意它是否是不可变的。尽管尽可能使用最严格的使用类型始终是一种好习惯,但我没有看到任何暗示 Immutable 会比 Default 更差/更慢的情况。
  • 你说得对,我真的不应该担心这个,如果重要的话我想我会离线生成这些。是否有一个 API 可以处理 DDS 文件(所以我可以批量生成这些东西),最好是从 .net,或者没有这样的东西?
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
相关资源
最近更新 更多