2011-07-11 8 views
1

ビルドプロセスでfxc(HLSLシェーダコンパイラ)を使用できるようにするためにこのタスクを作成しました。さて、シェーダを使用すると、単一のソースファイルが得られ、複数の出力を生成するために異なるフラグを使用して複数回コンパイルする必要があることがよくあります。私はこれをVisual Studioに統合したいと思うので、同じファイルを複数の異なるメタデータで参照している新しいアイテムを追加することはできません。私はMSBuildに関しては専門家ではないので、これを行うための最善の方法が何であるかについては本当に分かりません。もちろん、1つの解決策は、私のfxcタスクをいくつかのカスタムマルチコンパイルビルドスクリプトにポイントするメタデータ値を各Itemに追加することです。しかし、これを純粋に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

私は今、マルチコンパイルメタデータを分割して各要素の新しい項目を生成する追加タスクを使用して解決しました。その後、私はこのような最終的なアイテムを生成するために他のターゲットを実行することができます:

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

これはかなりうまくいくようです。ありがとうございました:)

関連する問題