Здавалка
Главная | Обратная связь

Обзор шейдера для нашего приложения



Практически при любом отображении чего-либо на экран в DirectX11 необходимо использовать шейдеры. Шейдерпредставляет из себя программу на языке HLSL. Этот язык подобен языку C. В предыдущих разделах мы загрузили шейдер, но совершенно его не рассмотрели. Сейчас мы займемся этим. Шейдеры делятся на два типа – вершинный и пиксельный. Рассмотрим вершинный шейдер. Его назначение – просто преобразовывать координаты вершин. Если мы не будем их преобразовывать, то все координаты будут выведены на экран в таком пространстве:

То есть, если мы отобразим треугольник, находящейся в плоскости XY, то он предстанет в неизмененном виде. Однако если треугольник будет в плоскости XZ, то он будет в виде тонкой линии или не будет виден совсем. Если же мы установим камеру, то мы сможем вращать её вокруг треугольника, при этом также будут пересчитываться его координаты для вывода в вышеуказанное пространство экрана(-1,1),(-1,1). Пересчетом координат и занимается вершинныйшейдер – для этого каждая координата умножается на несколько матриц преобразования.

Стоит отметить, что если мы не будем умножать координаты точек на матрицы, или будем умножать их на еденичные матрицы – что соответствует отсутствию всякого преобразования, то это также можно использовать, например, для отображения всевозможных надписей, элементов интерфейса и другой плоской графики поверх основной 3d графики сцены. Также такая техника подойдет для игр где графика выполнена в виде спрайтов. На самом деле она настолько востребована, что системы частиц (партиклы) в какой то мере также используеют только частичное преобразование 3d координат, в результате чего частицы всегда выводятся на экран плоско, однако облака этих частиц, конечно же находятся в некотором объеме.

Но мы отступили от темы. Рассмотрим код нашегошейдера. Обратимся к вершинному шейдеру:

//------------------------------------------------------------------------------------// Constant Buffer Variables//------------------------------------------------------------------------------------cbuffer ConstantBuffer : register( b0 ){ matrix World; matrix View; matrix Projection;} //------------------------------------------------------------------------------------struct VS_OUTPUT{ float4 Pos : SV_POSITION; float4 Color : COLOR0;}; //------------------------------------------------------------------------------------// Vertex Shader//------------------------------------------------------------------------------------VS_OUTPUT VS( float4 Pos : POSITION, float4 Color : COLOR ){ VS_OUTPUT output = (VS_OUTPUT)0; output.Pos = mul( Pos, World ); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Color=float4(0.5f,0.5f,0.5f,1.0f); returnoutput;}

Обратите внимание на процедуру VS в нижней части кода. Это и есть вершинный шейдер. Входящими данными нашего вершинного шейдера являются параметры функции VS. Они соответствует формату, который мы рассматривали ранее в уроке, каждая вершина содержит координату и цвет. Сама процедура вершинногошейдера называется VS. Как вы можете видеть, шейдер имеет на выходе практически тот-жеформат что и на входе. В него входят координаты и выходят тоже координаты, только измененные. В текущем уроке мы умножаем координаты на единичные матрицы, что соответствует отсутствию всякого преобразования. (Для наглядности урока матрицы все же установлены так чтобы куб был повернут на 450 относительно вертикальной оси). Фактически, мы могли бы и просто приравнять output.Pos к input.Pos, тогда бы куб отображался плоским. Однако в следующих уроках мы установим матрицы для камеры и трансформаций и немного оживим сцену, поворачивая камеру на любые углы и рассматривая модель с различных сторон, а также приближая и отдаляя камеру.

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

//------------------------------------------------------------------------------------// Pixel Shader//------------------------------------------------------------------------------------float4 PS( VS_OUTPUT input ) : SV_Target{ returninput.Color;}

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

И последним разделом нашего шейдера является техника. Техника(technique) это уже как бы не код C, это что-то вроде материала. То есть для каждого вида материала мы можем выбрать произвольный вершинный и пиксельный шейдеры. То есть, в одном и том-же файле .fx может находиться много различных вершинных и пиксельных шейдеров, назначая определенный материал (но в DirectX он называется техникой).

technique11 Render{pass P0{SetVertexShader( CompileShader( vs_4_0, VS() ) );SetGeometryShader( NULL );SetPixelShader( CompileShader( ps_4_0, PS() ) );}}

Обратите внимание где именно в технике указывается название функций для вершинного и пиксельного шейдера. Указанием имен функций мы даем понять данному материалу (технике) что именно этот вершинный и пиксельный шейдер нужно установить.

Заключение

В данном уроке вы изучили как выводить 3d геометрию на экран и познакомились с шейдерами, которые нужны для её отображения. В следующем уроке мы познакомимся уустановкой камеры, но сначала мы немного погрузимся в обширный мир 3d математики, и вплотную столкнемся с матрицами.








©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.