Pull to refresh

Comments 13

Здравствуйте. Я пока только изучаю программирование 3D графики с использованием Direct3D API. В вашем HLSL шейдере я вижу использование техник и .fx файлов. Не могли бы Вы рассказать, как на сегодняшний день на практике используются шейдеры в DirectX? Дело в том, что, если я не ошибаюсь, .fx эффекты в основном используются со специальным Effects фреймворком (из d3dx11), который объявлен deprecated в последнем DirectX 11. Как сегодня в индустрии используются шейдеры? Создаются в отдельных файлах с константными буферами или каким-то образом можно использовать техники?
Насколько я понимаю fx файлы действительно объявлены deprecate с 11 версии. Использование файлов эффектов исключительно для удобоваримого описания настроек, и возможности содержать все типы шейдеров в одном файле. После генерации мы также получаем hlsl шейдер, с входной функцией main
float4x4 u_MVPMatrix;
struct VS_DEFAULT_OUTPUT {
    float4 position : POSITION;
    float2 texture_coord : TEXCOORD0;
    float4 color : COLOR0;
};
VS_DEFAULT_OUTPUT vs_default_texture(float4 u_position : POSITION, float2 u_texture_coord : TEXCOORD0, float4 u_color : COLOR0) {
    VS_DEFAULT_OUTPUT Out;
    ((Out).position = mul(u_MVPMatrix, u_position));
    ((Out).texture_coord = u_texture_coord);
    ((Out).color = u_color);
    return Out;
};
float4 ps_default_texture(VS_DEFAULT_OUTPUT Out, uniform sampler2D u_texture) : COLOR {
    float4 clr = (tex2D(u_texture, (Out).texture_coord) * (Out).color);
    return clr;
};
float4 main(VS_DEFAULT_OUTPUT Out, uniform sampler2D u_texture) : COLOR {
    return ps_default_texture(Out, u_texture);
};


сами по себе техники как я понимаю это описание к использованию шейдера, включение того или иного теста, указание входной функции. Все эти настройки можно хранить по раздельности с шейдером. А можно воспользоваться сторонними библиотеками к примеру NVFX. Как сейчас принято разрабатывать на последнем DX я честно говоря затрудняюсь ответить
Есть достаточно жесткий пайплайн: Effect->Technique->Pass, но если вы не будете использовать geometry shaders в принципе ничего не изменилось. hlsl файл компилируется в эффект, который содержит в себе техники и пассы. Считается что техника это завершенный рендер, но все можно сочетать в любых пропорциях. Если раньше приходилось отдельно применять VS/GS/PS шейдеры, то теперь можно выбрать технику и нужный пасс из эффекта и все настройки к контексту применятся пакетом. Для сложного рендера стало проще, для новичков сложнее вобщем. Мой совет, начинайте с D3D9, он проще и с него потом можно легко перейти на 11 когда возникнет реальная необходимость.
И да, AFAIK, не Effects стали deprecated, а поменялась реализация компилятора, что-то убрали, что-то перекинули в другие места. Сам пайплайн не меняли.
А что используют чаще? Эффекты или отдельные шейдеры? А ведь еще есть precompiled shaders и динамическая линковка. Вот вы, например, что используете?
Перешел на эффекты 4 месяца назад, стало удобнее. Но у меня жутко сложный рендеринг, т.к. я ускоряю WPF на GPU, в том числе и просто расчеты данных всякие. Эффекты компилируются из исходников хранящихся в embedded resource при загрузке сборок, нативные библиотеки для компиляции подгружаются автоматически в зависимости от платформы рантайма .NET. Как-то так.
В эффекте и переменные и constant buffer, описание типов, пара десятков шейдеров, несколько техник с 1-3 пассами.
А как интегрируете эффекты с приложением? В d3dcompiler_##.dll ничего про эффекты нет (если не ошибаюсь). Используете d3dx11effect фреймворк? Или что-то другое?
В SharpDX .NET обертки из коробки есть.
Мне кажется ваша проблема надумана. Дело в том, что opengl прекрасно поддерживается ios, вулкан- этот перепиленный огл, и использует он синтаксис glsl, ну а платформа винды, под которую заточен hlsl прекрасно работает с опенжеле.

Так вот, зачем вам генератор шейдеров, если уже есть glsl, под все возможные платформы? Суть аппловского метала, вулкана и hlsl в том, что они должны давать большую производительность из-за специализации под платформу. Если вы будете генерировать код под все платформы, то вы выстрелите себе в ногу, аннулировав приемущества, предоставленные этими апи.
Дело в том, что opengl прекрасно поддерживается ios
по мимо технической стороны вопроса часто на выбор технологии влияют другие факторы. К примеру приложения использующие Metal проще продвигать. Списков топ 10 лучших приложений использующих GLES я честно говоря не видел, а вот топ 10 лучших приложений с использованием метал встречаются. Да и думаю получить фичеринг приложению использующему любимое эплом детище будет проще.

под которую заточен hlsl прекрасно работает с опенжеле
есть ли поддержка opengl на мобильных платформах винды (после 8.0 версии)? Angle активно поддерживающийся google и ms работает явно хуже нативной поддержки DX

Да и цель статьи просто описать как можно уменьшить платформо-зависимый код.
Опенгл прекрасно не работает даже на взрослой винде.

А суть метала, вулкана и директ12 совсем не в специализации, а в предоставлении низкоуровневого доступа к железу без потери абстракции от железа насколько это возможно. Иначе во всем этом было бы мало смысла. Их суть это избавление от API оверхеда, а не избавление от всех абстракций.
Работа OpenGL на винде зависит от вендора видеокарты только. opengl32.dll сам по себе ничего не стоит. Для nVidia, например, это nvogl32/64.dll. У Intel/AMD своя dll'ка с полной реализацией OpenGL. На мобильных платформах все так же. Есть поддержка вендора для конкретной платформы — есть opengl.
Sign up to leave a comment.

Articles