SharpDX - ошибка fxc.exe при компиляции файла hlsl

Я начинаю изучать SharpDX и голографический шаблон для C#.

При компиляции проекта возникает ошибка при компиляции файла шейдера.

var vertexShaderByteCode = ShaderBytecode.CompileFromFile("Content/Shaders/VertexSharderShared.hlsl", "VS", "vs_5_0", ShaderFlags.Debug);

fxc.exe завершился с кодом 1.

В примере они используют некоторый файл .cso при загрузке шейдера в байт-код: code img

Поскольку я не совсем понимаю, откуда берется этот .cso и что такое Vprt, я предпочитаю загружать файл hlsl напрямую. Я использую SharpDX 3.0.2, SharpDX.Direct3D11 3.0.2 и SharpDX.D3DCompiler 3.0.2.

Спасибо!


person AnneP    schedule 22.01.2018    source источник
comment
Это скомпилированные шейдеры. fxc — это компилятор HLSL, и вы также можете запустить его через командную строку. Какую версию VS вы используете? VS должен автоматически компилировать ваши шейдеры при компиляции вашего проекта.   -  person Asesh    schedule 23.01.2018
comment
@Asesh Спасибо за ваш ответ. Я использую VS2017 и тестирую эмулятор Hololens. Я только что понял, что я должен указать место для скомпилированных шейдеров (файлы .cso). Я пробовал так много разных URI и, наконец, нашел правильный, но он всегда возвращает пустое значение байт-кода моей переменной (vertexShaderByteCode)   -  person AnneP    schedule 23.01.2018
comment
Хорошо, если вы посмотрите на этот исходный код: github. com/sharpdx/SharpDX/blob/master/Source/ ShaderBytecode.CompileFromFile: Compiles a shader or effect from a file on disk, поэтому вы используете неправильный метод, потому что cso уже является скомпилированным шейдером   -  person Asesh    schedule 23.01.2018
comment
Также CompilationResult является возвращаемым значением ShaderBytecode.CompileFromFile, а не байт-кодом шейдера.   -  person Asesh    schedule 23.01.2018
comment
Вероятно, что-то не так в вашем шейдере: Content/Shaders/VertexSharderShared.hlsl. Вы должны разместить его исходный код здесь   -  person Asesh    schedule 23.01.2018
comment
@Asesh Я не думаю, что это источник кода, это образец шейдера, предоставленный Microsoft в голографическом храме, к которому я никогда не прикасался. Кроме того, когда я попытался скомпилировать файл с помощью ReadDataAsync(), он сработал. Когда я использую метод CompileFromFile из SharpDX, он получает файл, но возвращает vertexShaderByteCode.ByteCode = empty.   -  person AnneP    schedule 23.01.2018


Ответы (1)


Файлы CSO должны быть загружены, а затем создан соответствующий шейдер. Ниже приведен пример функции, которую я использую для загрузки шейдера. Обратите внимание, что в этом примере вы должны сохранить байт-код, а также вершинный шейдер.

Вспомогательная функция — это моя кросс-оболочка uwp/mfc, но в основном она возвращает файл в потоке данных в памяти.

Файл CSO представляет собой байт-код, его нужно прикрепить к правильному классу шейдера Sharpdx.Direct3D11.

Байт-код также используется для ссылки на семантический интерфейс (только для буферов вершин). как только вы его создали, ваш вызов отрисовки может сопоставить данные с регистром графического процессора, с которым он связан. Но приведенный ниже код, по крайней мере, загрузит ваш CSO-файл и создаст вершинный шейдер.

удачи.

         using (Stream fileStream = Helper.GetFileStream(a_fileName, a_filePath))
        {
            a_byteCode = new D3DCompiler.ShaderBytecode(fileStream);

            if (a_byteCode != null)
            {
                a_child = new D3D11.VertexShader(a_device, a_byteCode)
                {
                    DebugName = "a_fileName"
                };
            }
            else
            {
                throw new Exception("Unable to load file: " + a_fileName);
            }

        }
person ErnieDingo    schedule 30.01.2018
comment
да, это очень похоже на схему, используемую в голографическом шаблоне. В то время я не понимал, что файлы hlsl будут скомпилированы в .cso одновременно с компиляцией проекта. Спасибо! - person AnneP; 31.01.2018