1

所以我正在用 C#/.NET 为自己开发一个游戏引擎框架,并且我一直在尝试简化构建着色器文件(渲染引擎使用我想从 GLSL 源生成的 SPIR-V 文件)。我目前的方法是使用导入到 CSPROJ 中的自定义 .targets 文件,该文件定义了一个自定义目标,如下所示:

<Target
    Name="Vert"
    AfterTargets="Build">
    <MakeDir Directories="$(OutputPath)%(VertShader.RelativeDir)"/>
    <Exec Command='"$(ENGINE_ROOT)\tools\glslang\windows-x64\glslangValidator.exe" -V %(VertShader.Identity) %(VertShader.OptLevel) -o $(OutputPath)%(VertShader.Identity).spv'></Exec>
</Target>

这背后的一般想法是它需要 VertShader 项目,通过 glslang 运行 .vert 文件,并将输出 .vert.spv 文件吐出到构建输出目录中。这工作得很好,几乎

问题是,如果我的项目 A 有一堆着色器,然后项目 B 引用了项目 A,我想将项目 A 生成的 .vert.spv 着色器复制到项目 B 的构建输出目录中,但我没有太多的运气来争论目标语法来做我想做的事。

有什么办法可以让我按照我描述的方式工作吗?

4

2 回答 2

0

我不确定我是否正确理解了您的问题,但是如果您希望将 .vert.spv 复制到另一个文件夹,请使用 File.Copy()

于 2022-01-14T02:16:10.367 回答
0

好吧,所以我认为我确实设法自己弄清楚了,添加一个答案以防它对其他人有帮助。将此添加到我的 .targets 文件似乎允许将它们复制到任何依赖项目。我相信这基本上是使用 MSBuild 复制到当前构建输出目录的文件列表来注册我正在创建的所有文件(这会导致它们被复制到引用此目录的任何项目)

<Target
    Name="IncludeVert"
    BeforeTargets="GetCopyToOutputDirectoryItems">
    <ItemGroup>
        <CompiledVerts Include="@(VertShader -> '$(OutputPath)%(RelativeDir)%(Filename).vert.spv' )">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
            <TargetPath>%(RelativeDir)%(Filename).vert.spv</TargetPath>
        </CompiledVerts>
        <AllItemsFullPathWithTargetPath Include="@(CompiledVerts->'%(FullPath)')"  />
    </ItemGroup>
</Target>
于 2022-01-14T05:57:48.697 回答