在VS2022中构建像素着色器项目

dot*_*NET 3 hlsl msbuild-task visual-studio fragment-shader

我有一个旧的类库项目,在以前版本的 Visual Studio (2017 IIRC) 中构建得很好。该项目包含一个基于 HLSL 的像素着色器,可生成径向颜色选择器。我刚刚将它移植到 VS2022,它不再构建,告诉我它找不到构建任务。这是错误消息:

无法从程序集 ShaderBuildTask 加载“ShaderBuildTask.PixelShaderCompile”任务,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125。无法加载文件或程序集“ShaderBuildTask,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125”或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项均可用,并且任务包含实现 Microsoft.Build.Framework.ITask.AngularGradientShaderEffect 的公共类

我已经ShaderBuildTaskSetup.msi在我的机器上安装了所需的着色器编译器 ( )。重新加载项目并重新启动 VS 也没有帮助。

有人在 VS2022 中使用像素着色器来看看我缺少什么吗?

Sim*_*ier 6

人们可以在 Internet 上的各个地方看到使用和讨论的 MsBuild 任务程序集ShaderBuildTask已经有 10 多年前的历史了,它是用 C++ 为 x86 处理器编写的。它还取决于今天可能不存在或无法轻松加载的文件(DirectX9 等)。

该程序集仅包含一项任务,即PixelShaderCompile. .fx它的作用是从项目(顺便说一句,不一定是 C# 项目)中获取文件(“效果文件”),将它们编译为.ps文件(使用D3DXCompileShader 函数或类似函数)并将它们作为资源添加到项目中。

这项工作可以用 Windows SDK 的Effect Compiler 工具(fxc.exe)和MsBuild Exec 任务来代替。例如,此任务将项目中的所有 .fx 文件编译为 .ps 文件,就像PixelShaderCompile

<Exec Command="&quot;$(MSBuildProgramFiles32)\Windows Kits\10\bin\10.0.22621.0\x64\fxc.exe&quot; /T ps_3_0 /Fo @(Effect -> '%(Filename).ps') @(Effect)"/>
Run Code Online (Sandbox Code Playgroud)

请注意,需要Windows SDK,并且路径必须适应其当前版本(此处为 10.0.22621.0)。

因此,要整合此任务,您必须:

1> 删除

<UsingTask TaskName="ShaderBuildTask.PixelShaderCompile" AssemblyName="ShaderBuildTask, Version=1.0.3072.18169, Culture=neutral, PublicKeyToken=44e467d1687af125" />
Run Code Online (Sandbox Code Playgroud)

或项目文件中的类似行(此处为 .csproj)。

2> 更换线路

<Target Name="EffectCompile" Condition="'@(Effect)' != '' ">
  <PixelShaderCompile Sources="@(Effect)">
    <Output TaskParameter="Outputs" ItemName="Resource" />
  </PixelShaderCompile>
</Target>
Run Code Online (Sandbox Code Playgroud)

通过这样的事情:

<Target Name="EffectCompile" Condition="'@(Effect)' != '' ">
  <Exec Command="&quot;$(MSBuildProgramFiles32)\Windows Kits\10\bin\10.0.22621.0\x64\fxc.exe&quot; /T ps_3_0 /Fo %(Effect.RelativeDir)%(Effect.FileName).ps %(Effect.Identity)"/>

  <!-- Add this if you need to embed the file as WPF resources -->
  <ItemGroup>
    <Resource Include="%(Effect.RelativeDir)%(Effect.FileName).ps" />
  </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

请注意,这样做的一个额外好处是您可以调整fxc.exe命令行以满足您无法完成该PixelShaderCompile任务的某些特定需求。