Msbuild 着色器多编译器
我创建了这个任务,使我能够在构建过程中包括fxc(HLSL着色器编译器)。现在,着色器的问题是,通常您只获得一个源文件,并希望使用不同的标志对其进行多次编译,以生成多个输出。我不能只添加一个新项目,多次引用同一个文件和不同的元数据,因为我想将它集成到VisualStudio中,至少VS会因为我试图这么做而对我大喊大叫。对于MSBuild,我不是专家,所以我真的不确定什么是最好的方法。当然,一种解决方案是只向每个将fxc任务指向某个自定义多编译构建脚本的项添加一些元数据值。但是,如果有一种很好的方法可以完全在MSBuild中解决这个问题,那么我宁愿使用这种方法,而不是自定义构建的系统。我尝试让一个目标在构建期间生成多个项(HLSL是通过fxc运行的项):Msbuild 着色器多编译器,msbuild,Msbuild,我创建了这个任务,使我能够在构建过程中包括fxc(HLSL着色器编译器)。现在,着色器的问题是,通常您只获得一个源文件,并希望使用不同的标志对其进行多次编译,以生成多个输出。我不能只添加一个新项目,多次引用同一个文件和不同的元数据,因为我想将它集成到VisualStudio中,至少VS会因为我试图这么做而对我大喊大叫。对于MSBuild,我不是专家,所以我真的不确定什么是最好的方法。当然,一种解决方案是只向每个将fxc任务指向某个自定义多编译构建脚本的项添加一些元数据值。但是,如果有一种很好的方
vs
$(OutDir)%(文件名).vsh
vs_4_0
顶点着色器
$(OutDir)%(文件名).psh
ps_4_0
像素着色器
这基本上是可行的,但我需要像
vs;ps
生成这两个项,似乎没有简单的方法可以不进行一些黑客攻击就完成必要的字符串操作。我还可以为每种要生成的项添加单独的元数据值。但不知何故,我觉得我错过了真正的解决方案,所以我寻求您的专家建议;) 我现在解决了这个问题,使用了一个额外的任务来拆分多编译元数据并为每个元素生成新项。之后,我可以运行其他目标以生成最终项目,如下所示:
<!-- This Task splits up the Multicompile Metadata and spawns new Items based on this info -->
<Target Name="HLSLMulticompile" BeforeTargets="HLSL;HLSLClean" DependsOnTargets="HLSLSelectedFiles">
<HLSLBuild.Multicompile Inputs="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''">
<Output TaskParameter="Outputs" ItemName="HLSLMulti" />
</HLSLBuild.Multicompile>
<ItemGroup>
<HLSL Remove="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''" />
</ItemGroup>
</Target>
<!-- These Tasks generate the final Items -->
<Target Name="VertexShader" AfterTargets="HLSLMulticompile">
<ItemGroup>
<HLSL Include="@(HLSLMulti)" Condition="'%(HLSLMulti.Multicompile)' == 'vs'">
<TargetFile>$(OutDir)%(Filename).vsh</TargetFile>
<EntryPoint>VSMain</EntryPoint>
</HLSL>
</ItemGroup>
</Target>
<Target Name="PixelShader" AfterTargets="HLSLMulticompile">
<ItemGroup>
<HLSL Include="@(HLSLMulti)" Condition="'%(HLSLMulti.Multicompile)' == 'ps'">
<TargetFile>$(OutDir)%(Filename).psh</TargetFile>
<EntryPoint>PSMain</EntryPoint>
</HLSL>
</ItemGroup>
</Target>
$(OutDir)%(文件名).vsh
VSMain
$(OutDir)%(文件名).psh
PSMain
这似乎很有效。谢谢大家:)我现在解决了这个问题,使用了一个额外的任务来拆分多编译元数据并为每个元素生成新项。之后,我可以运行其他目标以生成最终项目,如下所示:
<!-- This Task splits up the Multicompile Metadata and spawns new Items based on this info -->
<Target Name="HLSLMulticompile" BeforeTargets="HLSL;HLSLClean" DependsOnTargets="HLSLSelectedFiles">
<HLSLBuild.Multicompile Inputs="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''">
<Output TaskParameter="Outputs" ItemName="HLSLMulti" />
</HLSLBuild.Multicompile>
<ItemGroup>
<HLSL Remove="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''" />
</ItemGroup>
</Target>
<!-- These Tasks generate the final Items -->
<Target Name="VertexShader" AfterTargets="HLSLMulticompile">
<ItemGroup>
<HLSL Include="@(HLSLMulti)" Condition="'%(HLSLMulti.Multicompile)' == 'vs'">
<TargetFile>$(OutDir)%(Filename).vsh</TargetFile>
<EntryPoint>VSMain</EntryPoint>
</HLSL>
</ItemGroup>
</Target>
<Target Name="PixelShader" AfterTargets="HLSLMulticompile">
<ItemGroup>
<HLSL Include="@(HLSLMulti)" Condition="'%(HLSLMulti.Multicompile)' == 'ps'">
<TargetFile>$(OutDir)%(Filename).psh</TargetFile>
<EntryPoint>PSMain</EntryPoint>
</HLSL>
</ItemGroup>
</Target>
$(OutDir)%(文件名).vsh
VSMain
$(OutDir)%(文件名).psh
PSMain
这似乎很有效。谢谢大家:)