Как добавить пользовательский скомпилированный файл (в Target / Exec) в качестве ресурса в .csproj's? - PullRequest
0 голосов
/ 29 октября 2019

Я делаю несколько эффектов затенения в проекте wpf_c #, и я не знаю, и я не нашел, как добавить пиксельный шейдер байт-кода (.ps) в качестве ресурса после того, как был скомпилирован целевым / exec. Это мой фрагмент кода csproj:

<ItemGroup>
    <AvailableItemName Include="PixelShader"/>
</ItemGroup>
<ItemGroup>
    <PixelShader Include="Shaders\BlueToneShader.fx" />
    bla bla bla other shaders bla bla
</ItemGroup>
<Target Name="PixelShaderCompile" Condition="@(PixelShader)!=''" BeforeTargets="Build">
    <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\fxc.exe&quot; %(PixelShader.Identity) /T ps_3_0 /E main /Fo%(PixelShader.RelativeDir)%(PixelShader.Filename).ps" />
</Target>

Все идет хорошо, и файлы .ps генерируются правильно, например:

PixelShaderCompile:   
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\fxc.exe" Shaders\BlueToneShader.fx /T ps_3_0 /E main /FoShaders\BlueToneShader.ps
Microsoft (R) Direct3D Shader Compiler 10.1 Copyright (C) 2013 Microsoft. All rights reserved.

compilation object save succeeded; see "folder"...

Но сейчас я не знаю, как это добавить. ps файл как 'Ресурс' во время компиляции. Кто-нибудь знает как? Я не нашел чёткой документации.

1 Ответ

0 голосов
/ 07 ноября 2019

После 3-4 часов пробных ошибок я нашел (я думаю, грязный) способ сделать это: msbuild (.csproj) выглядит так:

<PropertyGroup>
    <BuildDependsOn>
       PixelShaderCompile
       $(BuildDependsOn)
    </BuildDependsOn>
</PropertyGroup>
<ItemGroup>
    <AvailableItemName Include="PixelShader">
       <Visible>true</Visible>
    </AvailableItemName>
</ItemGroup>
<ItemGroup>
    <PixelShader ... />
    ...
</ItemGroup>
<Target Name="PixelShaderCompile" Condition="@(PixelShader)!=''" BeforeTargets="BeforeBuild;BeforeRebuild">
    <MakeDir Directories="$(IntermediateOutputPath)%(PixelShader.RelativeDir)" Condition="!Exists('$(IntermediateOutputPath)%(PixelShader.RelativeDir)')" />  
    //You put your fxc.exe command here
    <Exec Command="&quot;C:\bla bla bla\fxc.exe&quot; %(PixelShader.Identity) /T ps_3_0 /E PSmain /O3 /Fo$(IntermediateOutputPath)%(PixelShader.RelativeDir)%(PixelShader.Filename).ps" Outputs="$(IntermediateOutputPath)%(PixelShader.RelativeDir)%(PixelShader.Filename).ps">
          <Output ItemName="CompiledPixelShader" TaskParameter="Outputs" />
    </Exec>
    <ItemGroup>
        <Resource Include="@(CompiledPixelShader)" />
    </ItemGroup>
</Target>
//If you want to clear the .ps generated file 
<Target Name="PixelShaderClean" Condition="@(PixelShader)!=''" AfterTargets="AfterBuild;AfterRebuild">
    <Delete Files="$(IntermediateOutputPath)%(PixelShader.RelativeDir)%(PixelShader.Filename).ps" />
</Target>

Вот и все ... Так сложнопотому что примеров файлов msbuild не так много.

...