2011-07-11 32 views
1

我創建了這個任務,使我能夠在我的構建過程中包含fxc(HLSL着色器編譯器)。現在,着色器的情況是,你經常得到一個單一的源文件,並且希望用不同的標誌多次編譯它以產生多個輸出。我不能只是添加一個新的Item,它會使用不同的元數據多次引用同一個文件,因爲我希望它能夠集成到Visual Studio中,並且至少VS會試圖這樣做。在MSBuild方面,我不是專家,所以我真的不確定什麼是最好的方法來做到這一點。當然,一種解決方案是僅僅爲每個Item添加一些元數據值,將我的fxc Task指向一些自定義的多版本生成腳本。但是如果有一種很好的方法可以純粹在MSBuild中解決這個問題,那麼我更喜歡這個定製的系統。我試着具有目標的構建過程中生成多個項目(HLSL是通過FXC運行的項目):Shader Multicompile

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    <HLSL Include="default.hlsl"> 
     <Multicompile>vs</Multicompile> 
    </HLSL> 
    <HLSL Include="shadow.hlsl" /> 
    </ItemGroup> 


    <Target Name="ShaderMulticompile" BeforeTargets="HLSL" DependsOnTargets="HLSLSelectedFiles"> 
    <ItemGroup> 
     <HLSL Include="@(HLSL)" Condition="'%(HLSL.Multicompile)' == 'vs'"> 
     <TargetFile>$(OutDir)%(Filename).vsh</TargetFile> 
     <TargetProfile>vs_4_0</TargetProfile> 
     <EntryPoint>VertexShader</EntryPoint> 
     <Multicompile /> 
     </HLSL> 
     <HLSL Include="@(HLSL)" Condition="'%(HLSL.Multicompile)' == 'ps'"> 
     <TargetFile>$(OutDir)%(Filename).psh</TargetFile> 
     <TargetProfile>ps_4_0</TargetProfile> 
     <EntryPoint>PixelShader</EntryPoint> 
     <Multicompile /> 
     </HLSL> 
    </ItemGroup> 
    </Target> 

    <Target Name="RemoveShaderMulticompileSourceItems" AfterTargets="ShaderMulticompile"> 
    <ItemGroup> 
     <HLSL Remove="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''" /> 
    </ItemGroup> 
    </Target> 

    <Target Name="CleanShaderMulticompile" BeforeTargets="HLSLClean" DependsOnTargets="ShaderMulticompile" /> 
</Project> 

這基本上作品,但我需要有像<Multicompile>vs;ps</Multicompile>元數據生成兩個項目,並似乎有沒有一些簡單的方法來做必要的字符串操作,而沒有一些黑客行爲我還可以爲每種要生成的項目添加單獨的元數據值。但我不知何故覺得我錯過了真正的解決方案,所以我尋求你的專家建議;)

回答

1

我現在解決了它通過使用一個額外的任務拆分Multicompile元數據併爲每個元素生成新的項目。之後,我可以運行其他目標來生成如下最終項目:

<!-- 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> 

這似乎工作得很好。謝謝大家:)