我们有一个目前使用DirectX11 SlimDX的项目,希望将其移动到SharpDX。但是,该项目使用了来自SlimDX的效果框架,据我所知,DirectX11不再正确地支持该框架。然而,我找不到确切的信息,我应该如何过渡的效果。
使用中的效果是相对简单的像素着色器,包含在.fx文件中。
我应该离开.fx文件吗?做什么?普通的.hlsl文件吗?还是应该使用SharpDX工具包?这是否使用与.fx文件不同的格式?
我找不到这方面的任何文件。有没有人能为我提供一些关于SharpDX工具包效果框架的建议或文档呢?
发布于 2014-06-19 10:42:43
迁移到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,按名称/语义获取,因此您需要将您的cBuffer映射到c#中的结构(您也可以直接使用datastream ),并创建常量缓冲区资源。
[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.Apply时的效果)。
此外,由于您单独编译着色器,没有更多的布局验证之间的阶段(效果编译器给你:没有有效的顶点阴影-像素阴影组合.)。因此,您需要小心地使用不匹配的着色器设置管道(您可以使用反射数据手动验证,或者在visual studio中查看带有调试运行时垃圾输出窗口的黑色屏幕)。
因此,转换可能有些乏味,但也可能是有益的,因为它更容易最小化管道状态的更改(在我的用例中,这不是一个问题,所以效果框架做得很好,但是如果您有大量的抽签调用,可能会变得很重要)。
https://stackoverflow.com/questions/24185470
复制相似问题