从SlimDX移动到SharpDX -效果

本文关键字:效果 SharpDX SlimDX 移动 | 更新日期: 2023-09-27 18:08:15

我们有一个项目,目前使用DirectX11 SlimDX,并希望将其移动到SharpDX。然而,这个项目使用了SlimDX的效果框架,我知道DirectX11不再正确支持它。但是,我找不到关于如何过渡效果的明确信息。

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

我应该远离。fx文件吗?什么?到普通的。hlsl文件?还是应该使用SharpDX工具箱?这是否使用与.fx文件不同的格式?

我找不到任何关于这个的文档。有没有做过这个转换的人可以给我一些建议,或者关于SharpDX工具包效果框架的任何文档?

从SlimDX移动到SharpDX -效果

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

关于效果框架,你有库SharpDX.Direct3D11。效果来包装它,所以你当然支持它。它与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, Get按名称/语义,所以你需要映射你的cBuffer到c#中的结构(你也可以直接使用数据流),并创建常量缓冲资源。

[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绑定到管道。

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

ShaderReflection refl = new ShaderReflection(result.Bytecode);

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

也因为你单独编译着色器,没有更多的阶段之间的布局验证(效果编译器给你:没有有效的VertexShader-PixelShader组合....)。所以你需要小心地设置你的管道与不匹配的着色器(你可以使用反射数据来手动验证,或者看到一个黑屏与调试运行时垃圾输出窗口在visual studio)。

所以过渡可能有点乏味,但也可以是有益的,因为它更容易减少管道状态的变化(在我的用例中,这不是一个问题,所以效果框架做得很好,但如果你有大量的绘制调用可能变得重要)。