c# - 从 SlimDX 迁移到 SharpDX - 效果

标签 c# .net slimdx sharpdx

我们有一个项目当前使用 DirectX11 SlimDX,并希望将其移至 SharpDX。但是,该项目使用 SlimDX 的 Effect 框架,据我所知,DirectX11 不再正确支持该框架。但是,我找不到有关如何转换效果的明确信息。

使用的效果是相对简单的像素着色器,包含在 .fx 文件中。

我应该放弃 .fx 文件吗?做什么?到普通的 .hlsl 文件?或者我应该使用 SharpDX 工具包?这是否使用与 .fx 文件不同的格式?

我找不到任何关于此的文档。有没有完成此转换的人可以给我一些建议,或者任何有关 SharpDX Toolkit 效果框架的文档?

最佳答案

迁移到 SharpDX 非常简单,命名和资源描述方面有一些更改,但除了相对麻烦(取决于代码库的大小)这一事实之外,没有什么太复杂的。

关于效果框架,您有包含它的库 SharpDX.Direct3D11.Effects,所以您当然支持它。 它与 SlimDX 的对应版本几乎相同,因此您应该不会遇到任何重大问题。

如果你想从fx框架过渡到更简单的hlsl,你可以保留相同的fx文件,编译步骤会改变,而不是在编译整个文件时,你需要单独编译每个着色器。

例如,编译并创建 VertexShader:

CompilationResult result = ShaderBytecode.Compile(content, "VS", "vs_5_0", flags, EffectFlags.None, null, null);

VertexShader shader = new VertexShader(device, result.Bytecode);

此外,您还需要小心所有常量缓冲区/资源寄存器,通常最好明确地设置它们,例如:

cbuffer cbData : register(b0)
{
float4x4 tW;
    float4x4 tColor;
float4 cAmb;
};

你当然不再拥有所有的 EffectVariable,通过名称/语义获取,所以你需要将你的 cBuffer 映射到 c# 中的结构(你也可以直接使用 datastream),并创建 Constant 缓冲区资源。

[StructLayout(LayoutKind.Sequential,Pack=16)]
public struct cbData
{
    public Matrix tW;
    public Matrix tColor;
    public Vector4 cAmb;
}

BufferDescription bd = new BufferDescription()
{
   BindFlags = BindFlags.ConstantBuffer,
   CpuAccessFlags = CpuAccessFlags.Write,
   OptionFlags = ResourceOptionFlags.None,
   SizeInBytes = 144, //Matches the struct
   Usage = ResourceUsage.Dynamic
};

var cbuffer = new SharpDX.Direct3D11.Buffer(device, bd);

使用 UpdateSubResource 或 MapSubresource 更新数据,并使用 deviceContext.VertexShader.SetConstantBuffer 绑定(bind)到管道。

如果您需要使用反射检查着色器,可以这样做(请注意,这实际上是效果框架的作用,它只是 d3dcompiler 之上的一层):

ShaderReflection refl = new ShaderReflection(result.Bytecode);

然后,您需要手动设置所有 API 调用(这就是当您调用 EffectPass.Apply 时 Effects 为您所做的事情)。

此外,由于您单独编译着色器,因此阶段之间不再有布局验证(效果编译器给您:没有有效的 VertexShader-PixelShader 组合......)。因此,您需要小心地使用不匹配的着色器设置管道(您可以使用反射数据手动验证,或者在 Visual Studio 中使用调试运行时垃圾邮件发送输出窗口来观看黑屏)。

因此,转换可能有点乏味,但也可能是有益的,因为更容易最小化管道状态更改(在我的用例中,这不是一个问题,所以效果框架做得很好,但如果您有大量绘制调用可能会变得很重要)。

关于c# - 从 SlimDX 迁移到 SharpDX - 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24185470/

相关文章:

c# - 在这种情况下如何减少垃圾产生

c# - 检测按键按下

c# - .net4 上的 SHA1 生成

c# - 损坏的性能计数器?

c# - 重命名服务器目录中的图像文件

c# - Angular 6 - 单个表单组中的多个文件输入

.net - 使用 Powershell TOM 在 SSAS 表格中创建分区

c# - 事件处理程序影响 CLR 中的垃圾回收

c# - 使用 Windows Phone 8.1 后退键按下事件