Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 41. Шейдеры GLSL. Использование через компонент glslshader. Часть первая — первые шаги

Поиск

 

Карпенюк Алексей (karpenyuk@bk.ru)

(публикация стилизована)

В данной статье мы научимся добавлять к нашей программе эффекты, созданные при помощи шейдеров. Итак, создадим простой проект — разместим на форме GLScene, GLSceneViewer, GLMaterialLibrary и самое главное — GLSLShader из закладки GLScene Shaders.

Теперь выполним стандартные процедуры по созданию сцены — подберем размер формы и GLSceneViewer1, добавим в GLScene1 камеру и TGLFreeForm в качестве нашего объекта. Не забываем связать нашу камеру с GLSceneViewer1. Немного настроим камеру — для начала стоит ее немного отодвинуть от начала координат, иначе мы не увидим наш объект, для этого указываем в свойстве Position новые координаты (0; 0; 7). На этом подготовительную часть можно считать завершенной.

Переходим к выбору объекта — возьмем один из стандартных объектов, поставляемый вместе со сценой, к примеру mushroom.3ds. В OnCreate формы запишем:

GLFreeForm1.ObjectStyle:=[osDirectDraw];

GLFreeForm1.LoadFromFile(‘mushroom.3ds’);

GLFreeForm1.NormalsOrientation:=mnoInvert;

GLFreeForm1.PitchAngle:=90;

Изначально гриб имеет очень большие размеры, потому можете смело выставлять GLFreeForm1.Scale по каждой из осей равным 0,05. Строка GLFreeForm1.ObjectStyle:=[osDirectDraw] избавит нас от проблем на видеокартах ATI. Так как изначально нормали у нашего гриба повернуты вовнутрь, то мы их сразу же вывернем наружу через GLFreeForm1.NormalsOrientation:=mnoInvert. Так использования формата 3ds необходимо подключить модуль GLFile3DS. Если все сделано правильно, то после запуска программы мы увидим черный гриб. Почему он черный? Потому что мы не создали в сцене никаких источников света, но на данном этапе это нам не важно.

Теперь переходим к самому интересному — подключим к грибу шейдер. Весь этап подключения заключается в создании нового материала, связывании его с шейдером и применении его к объекту.

Первым делом создадим новый материал в библиотеке материалов, для этого дважды щелкнем по GLMaterialLibrary1 и в появившемся окне создадим новый материал, назовем его ShaderMaterial. Теперь в инспекторе объектов свойству Shader присвоим значение GLSLShader1 (можно выбрать из списка) — в этом и заключается связывание.

После того, как мы создали новый материал и указали, что за этот материал у нас будет отвечать шейдер, нам нужно применить его к нашему объекту. Выбираем GLFreeForm1, ищем у него свойство Material, раскрываем свиток, выбираем там MaterialLibrary и указываем там GLMaterialLibrary1. Теперь нам нужно указать, какой материал из этой библиотеки у нас будет использован, для этого ищем там же свойство LibMaterialName и указываем там созданный нами материал — ShaderMaterial.

Итак, половина пути пройдена, самое время заняться написанием самого шейдера.

Чтобы подчеркнуть, что шейдер это отдельная программа, мы будем ее создавать в обычном текстовом редакторе. У такого способа есть как недостаток (придется периодически переключаться между окном Delphi и блокнотом), но зато мы всегда сможем быстро получить наш шейдер. К примеру для внесения исправлений без запуска Delphi, или вдруг захотим его кому-то передать, или же просто захотим отладить или изменить его в специализированных редакторах, на подобии ATI RenderMonkey.

Итак, открываем блокнот и пишем там следующее:

void main(void)

{

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

}

И сохраняем этот файл под именем «shader.vert», Это и будет наш вершинный шейдер. Как видите, там пока только одна команда, без которой нам никак не удастся обойтись — оно производит трансформацию координат вершины, используя видовую матрицу модели. Теперь создаем новый файл и помещаем в него такой вот текст:

void main(void)

{

gl_FragColor = vec4(0.4, 0.0, 0.9, 1.0);

}

Сохраняем его с именем «shader.frag» — это будет наш фрагментный шейдер. Как вы видите, там пока тоже только одна строка, и тоже обязательная — она возвращает цвет для данной вершины. В нашем примере для всех вершин задан одинаковый цвет, в чем мы скоро убедимся.

Итак, файлы шейдеров созданы, самое время запустить их. Для этого нам потребуется еще немного изменить обработчик события формы OnCreate — допишем туда вот такие строчки:

GLSLShader1.LoadShaderPrograms(‘shader.vert’, ‘shader.frag’);

GLSLShader1.Enabled:= true;

Данным фрагментом кода мы загрузили обе наших шейдерных программы и активировали шейдер. Теперь можно попробовать запустить программу. Если вы все сделали правильно, то, как я и обещал, вы увидите гриб, залитый одним цветом (0.4, 0.0, 0.9, 1.0). Можете изменить его, только не забывайте после каждого изменения шейдера перезапускать программу (можно уже откомпилированную ранее).

Теперь для справки приведу таблицу со значениями всех свойств компонента GLSLShader.

Свойство Описание
ActiveVarying Нужно только для Transform Feedback. Это свойство говорит компоновщику о том, какие варьируемые переменные не подлежат удалению при оптимизации. Можно сделать все varying переменные активными.
Enabled Если True, то шейдер активен.
FailedInitAction Если по каким-либо причинам шейдер не удалось инициализировать, будут приняты меры, в зависимости от значения этого свойства. fiaRaiseStandardException (значение по умолчанию) — вызывает исключение со строкой от функции GetStardardNotSupportedMessage. fiaRaiseHandledException — работает так же, как и предыдущее, но помещает вызов функции GetStardardNotSupportedMessage в секцию try-except (полезно при отладке в Delphi); fiaReRaiseException — Re-raises the exception; fiaSilentDisable — простро выключает шейдер.
VertexProgram, FragmentProgram Содержат тексты вершинной и фрагментной программ и указывают, будут ли они использоваться.
GeometryProgram Code содержит текст геометрической программы. Enabled отвечает за ее активность. InputPrimitiveType — задаёт тип вершин, которые отправляются в шейдер, может быть: gsInPoints (точки), gsInLines (отрезки), gsInAdjLines (отрезки, плюс для каждого отрезка доступны одна предыдущая вершина и одна последующая), gsInTriangles (треугольники) или gsInAdjTriangles (треугольники, каждому треугольнику доступны три предшествующие координаты). OutputPrimitiveType — задаёт тип вершин в выходном примитиве, может быть: csoutPoints, csoutLineStrip или csoutTriangneStrip(по умолчанию) VerticesOut — количество вершин, которое сгенерирует шейдер. Имеет свои пределы, так, GeForce 8XXX может сгенерировать не больше 1024 вершин.
ShaderStyle Отвечает за то, как будут взаимодействовать материал OpenGL (см. команду glMaterialXXX) и шейдер. ssHighLevel: шейдер применяется до материала и unapplied material unapplication; ssLowLevel (значение по умолчанию): шейдер применяется после материала и unapplied before material unapplication; ssReplace: шейдер применяется вместо материала (и материал полностью игнорируется).
TransformFeedBackMode Нужно только для Transform Feedback. Может быть: tfbmInterleaved — вершинные атрибуты записываются как interleaved в один буфер; tfbmSeparate — каждый вершинный атрибут записывается отдельно в выделенный для него буфер.



Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 468; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.145.136 (0.005 с.)