ShaderBytecode编译一种技术多遍

我有一个像基本结构的效果代码

technique TechniqueName { pass FirstPass { Profile = fx_4_0 VertexShader = RenderFirstVS GeometryShader = null PixelShader = RenderFirstPS } pass SecondPass { Profile = fx_4_0 VetrexShader = RenderSecondVS GeometryShader = null PixelShader = RenderSecondPS } pass ThirdPass { Profile = fx_4_0 VertexShader = RenderThirdVS GeometryShader = null PixelShader = RenderThirdPS } } 

现在我试着编译这个

 using (BinaryReader reader = new BinaryReader(stream)) { CompilationResult result = ShaderBytecode.Compile(reader.ReadBytes((int)stream.Length), "fx_4_0"); if (result.HasErrors) { throw new Exception(result.Message, new Exception(result.ResultCode.ToString())); } Data = result.Bytecode.Data; } 

stream是new MemoryStream(Encoding.Default.GetBytes(effectContent))
数据属性( byte[] )大约是1 KiB,但是如果我尝试通过加载它

 context.InputAssembler.InputLayout = new InputLayout(device, effect.Data, someElements) 

它崩溃与以下exceptionD3D11 ERROR: ID3D11Device::CreateInputLayout: Input Signature in bytecode could not be parsed. Data may be corrupt or in an unrecognizable format. [ STATE_CREATION ERROR #161: CREATEINPUTLAYOUT_UNPARSEABLEINPUTSIGNATURE] D3D11 ERROR: ID3D11Device::CreateInputLayout: Input Signature in bytecode could not be parsed. Data may be corrupt or in an unrecognizable format. [ STATE_CREATION ERROR #161: CREATEINPUTLAYOUT_UNPARSEABLEINPUTSIGNATURE]

任何想法如何解决这个问题或为什么错误是抛出? 我不想使用多个着色器,因为我重复使用很多参数,我不想在延迟着色设置中重新分配。

在使用效果着色器语法(技巧和通行证)时,生成的字节码实际上是一个容器,其中包含每种技术和通道的每个编译顶点和像素着色器的字节码。 创建input布局时,您需要使用单个顶点着色器的字节码。 你必须从效果着色器中提取。

它看起来像在SharpDX中使用效果字节码创建一个Effect对象。 你应该能够遍历这些技巧,并通过效果,尽管从文档中我不清楚它是如何工作的。 如果您获得了EffectPassDescription ,那么就有一个Signature元素,您可以使用它来创建input布局。