Как создать шейдерный эффект (.fx) в csproj

Я пытаюсь создать пиксельный шейдер в библиотеке классов С#.

Я добавил файл fx в проект. Поскольку я не могу найти подходящего действия по сборке, я попытался вручную отредактировать csproj:

<FxCompile Include="MyEffect.fx">
  <ShaderType>Pixel</ShaderType>
</FxCompile>

но когда я пытаюсь найти файл ps, я получаю System.IO.IOException: Cannot locate resource 'MyEffect.ps'

вот код который выдает ошибку:

 public class MyEffect : ShaderEffect
 {
   public MyEffect(){
     this.PixesShader = new Uri("pack://application:,,,/WpfControlLibrary1;component/MyEffect.ps");
   }
 }

Как настроить мой проект, чтобы я мог найти скомпилированный шейдер?

Все учебники, которые я нашел, предназначены для проектов C++ или посвящены старым инструментам, таким как пользовательская задача сборки, но я думаю, что это не требуется с VS2012.

EDIT: Visual Studio компилирует файлы .fx только в проектах C++. В проектах C# это не работает. Здесь упоминается: http://blogs.msdn.com/b/chuckw/archive/2012/05/07/hlsl-fxc-and-d3dcompile.aspx


person Liero    schedule 08.10.2015    source источник
comment
Любой файл, добавленный в проект cs, будет иметь свойство с именем Build Action, оно должно быть Resource. Похоже, вы отредактировали его для использования компиляции, что, конечно, не сработает. Вам не следует редактировать файл проекта напрямую, если вы полностью не понимаете, что делаете. Ваш код выглядит нормально, я думаю, проблема только в том, что Build Action установлено на Compile, что неверно.   -  person Hopeless    schedule 08.10.2015
comment
Ну, я установил FxCompile, а не Compile. Я заметил FxCompile в некоторых проектах cpp. Действие сборки Resource не работает, потому что файл .fx должен быть сначала скомпилирован в файл .ps, а затем добавлен в ресурсы. Обратите внимание, что имя ресурса MyEffect.ps, а не MyEffect.fx.   -  person Liero    schedule 08.10.2015
comment
То, что я сказал вам установить для Build Action в Resource, это файл .ps. Кстати, я даже написал простую библиотеку, содержащую только пользовательские эффекты, и я точно знаю, что в .ps файлах Build Action должно быть установлено на Resource. То, что вы сделали с файлом csproject, следует откатить (чтобы убедиться, что это не повлияет на то, что вы будете делать дальше). Если возможно, попробуйте снова создать новый проект.   -  person Hopeless    schedule 08.10.2015
comment
Но у меня пока нет файла .ps. То есть вы говорите, что мне нужно скомпилировать hlsl вручную с помощью fxc.exe?   -  person Liero    schedule 08.10.2015
comment
да, на самом деле я использовал Shazzam (поддерживает редактор HLSL и предварительный просмотр). Итак, вы хотите, чтобы VS скомпилировал исходный код HLSL? Насколько я знаю, VS 2012 не может этого сделать, не уверен в более новых версиях. Или, может быть, он поставляется с каким-то плагином, помогающим сделать это.   -  person Hopeless    schedule 08.10.2015
comment
здесь в документации сказано, что fxc.exe интегрирован в Visual Studio, но работает только с проектами cpp, а не C#   -  person Liero    schedule 08.10.2015
comment
Установка его на Resource, кажется, помогает! Это было не совсем очевидно   -  person jhaagsma    schedule 17.05.2021


Ответы (1)


Вы можете установить параметр Postbuild для компиляции файлов fx с помощью fxc:

fxc /O0 /Fc /Zi /T  fx_5_0 /Fo myShader.fxo myShader.fx

Но я компилирую все свои шейдеры во время выполнения при разработке. Я не уверен, какую библиотеку С# вы используете, но вы можете сделать это как в SharpDX, так и в SlimDX:

ShaderBytecode.CompileFromFile(effectFile, "fx_5_0", ShaderFlags.None, EffectFlags.None);
person Stefan Agartsson    schedule 09.10.2015