Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics Directx 11.2带SharpDX的mipmaps?_Graphics_Rendering_Directx 11_Sharpdx_Mipmaps - Fatal编程技术网

Graphics Directx 11.2带SharpDX的mipmaps?

Graphics Directx 11.2带SharpDX的mipmaps?,graphics,rendering,directx-11,sharpdx,mipmaps,Graphics,Rendering,Directx 11,Sharpdx,Mipmaps,我使用的是与11.2兼容的SharpDX版本,到目前为止渲染效果良好,但是我开始使用大型纹理进行测试,需要mipmapping来避免比屏幕分辨率更高的纹理的丑陋瑕疵 根据我的理解,如果我想要完整的mipmap级别集,我需要在纹理创建中将mipmlevels设置为0,但是,将mipmlevels参数从1(它是什么并起作用)更改为0(我的目标)会导致纹理实例化行上的参数无效的异常 错误必须在该点或之前发生(在到达任何渲染之前和声明步骤时崩溃) 以下是我如何声明纹理状态: new SharpDX.Di

我使用的是与11.2兼容的SharpDX版本,到目前为止渲染效果良好,但是我开始使用大型纹理进行测试,需要mipmapping来避免比屏幕分辨率更高的纹理的丑陋瑕疵

根据我的理解,如果我想要完整的mipmap级别集,我需要在纹理创建中将mipmlevels设置为0,但是,将mipmlevels参数从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的数据

编辑:

这里提出了一个类似的问题:

您有几个不同的选择:

1) 离线生成mips(可能将纹理存储在DDS中,DDS支持mips),并为每个mip提供一个数据矩形阵列

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


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

如果您遵循,您应该能够自己诊断此问题。我只是按照这些步骤(打开本机调试并使用调试标志创建设备)。我仍然得到了相同的结果,一个SharpDXException声明我有一个不正确的参数。而且我也没有在输出窗口中得到任何东西,即使在执行了这些步骤之后(我使用VS 2013,如果这很重要的话)Ok不确定发生了什么,但本机调试再次被取消选中,重新检查了它,但它抱怨缺少nvumdshimx.dll,所以我认为我缺少了一些东西来正确调试它?通过进入Disassembly视图跳过缺少的pdb并跳过该行(这是在错误发生之前)但是,我从附加输出中获得的所有信息都是无用的:D3D11错误:ID3D11Device::CreateTexture2D:返回E_INVALIDARG,表示传递了无效参数。[STATE_CREATION ERROR#104:CREATETEXTURE2D_INVALIDARG_RETURN]我通过谷歌搜索DX11 mipmap找不到什么,但我根据您的回答推测,获取mipmap需要的不仅仅是设置mipmap级别。是的,我只加载一个普通的纹理,当从平面纹理开始时,什么是适当的方法来获得它的mipmap?(我不想在运行时更新它,所以我想坚持不变)我在原始答案的编辑中添加了一些额外的信息,如果您需要更多,请告诉我。是的,这很有帮助,谢谢。是否可以将纹理“转换”为不可变或从纹理创建纹理?(我是否可以使用解决方案2,然后以某种方式摆脱该纹理,转而使用预生成mips的不可变纹理?)。谢谢我不会太在意它是否是不变的。尽管使用最严格的使用类型始终是一种好的做法,但我没有看到任何迹象表明,Immutable将比默认值更糟糕/更慢。你说得对,我不应该真的担心这一点,如果有关系的话,我想我会离线生成它们。是否有一个API来处理DDS文件(这样我就可以批量生成这些文件),理想情况下是从.net生成的,还是没有?