![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глава 44. Шейдеры GLSL. Пост-эффектыСодержание книги
Поиск на нашем сайте
Пост эффекты встречаются почти в каждой современной игре, например в Crysis, STALKER, Mass Effect (список можно продолжать до бесконечности). В такой ситуации, когда почти каждая компания реализует пост-шейдерные эффекты, мы не можем оставаться в стороне. Пост-эффекты применяются уже к готовому изображению. Я предлагаю начать изучение с одного из самых простых шейдерных пост-эффектов — с эффекта перевода цветного изображения в чёрно-белое. Для начала нам понадобится какая-нибудь текстура (главное — не серая). Смысл нашей работы сводится к следующему:
Создайте в инспекторе объектов сцены компонент GLCube. Создайте у формы событие OnCreate. Здесь мы будем натягивать текстуру на куб: GLCube.Material.Texture.Image.LoadFromFile(‘Texture.jpg’); GLCube.Material.Texture.Disabled:=False; Далее кидаем на форму GLMaterialLibrary1 и GLFBORenderer1. В GLMaterialLibrary1 создайте материал с именем Ch/B, этот материал будет ключом к пост шейдеру. Для облегчения расчетов, свойства Material.MaterialOptions.moIgnoreFog и moNoLighting поставьте в значение True. После этого для него не будет рассчитываться освещение и туман (если есть). Material.Texture.ImageClassName должно быть Blank Image, иначе ошибка «FrameBuffer not complited». В GLFBORenderer1 назначьте свойству Camera единственную камеру, свойству MaterialLibrary единственную библиотеку материалов. В свойстве ColorTextureName нажмите выберите Ch/B. Пришло время написать шейдеры. Используемый шейдер — предмет особых пояснений. Мы не будем пока трогать сложные технологии по типу HDR или God Rays, но наш шейдер тоже хорош — программа перевода цветного изображения в чёрно-белое. Используется, кстати, относительно часто. От слов к делу! Вот вершинный шейдер: void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_TexCoord[0] = gl_MultiTexCoord0; } Тут производим трансформацию вершин с учётом модельно-видовой матрицы первой строкой, а второй передаём текстурные координаты в пиксельный шейдер.
Теперь фрагментный шейдер: uniform sampler2D image; const vec3 LUMINANCE_WEIGHTS = vec3(0.07, 0.07, 0.06); void main(void) { vec3 col = texture2D (image, gl_TexCoord[0].st).xyz; float lum = dot(LUMINANCE_WEIGHTS,col); gl_FragColor = vec4(lum,lum,lum,1.0); } Мы здесь впервые в GLSL встречаемся с константами. Их синтаксис предельно прост и не требует пояснения. Строкой vec3 col = texture2D (image, gl_TexCoord[0].st).xyz мы создаём вектор col, равный красному, зелёному и синему компонентам (xyz) пикселя текстуры image с координатами st. Допишите в событие OnCreate формы следующий код активации GLSLShader: GLSLShader1.LoadShaderPrograms(‘Shader.Vert’, ‘Shader.Frag’); GLSLShader1.Enabled:= true; Также необходимо передавать шейдеру текстуру. В событии OnApply шейдера запишите: with Shader do Param['image'].AsTexture2D[0]:=GLMaterialLibrary1. LibMaterialByName('Ch/B').Material.Texture; Перейдём к настройке GLHUDSprite. Поскольку он всегда должен закрывать весь экран, мы создадим у Form1 событие OnResize и запишем в него код подстройки размера спрайта под размеры формы и централизуем его: GLHUDSprite1.Width:= GLSceneViewer1.Width; GLHUDSprite1.Height:= GLSceneViewer1.Height; GLHUDSprite1.Position.SetPoint(GLSceneViewer1.Width div 2, GLSceneViewer1.Height div 2, 0); Почти всё. Осталось только запустить перерисовку сцены, иначе весь экран будет чёрный. Создайте GLCadencer, свойству Scene присвойте GLScene1. Создайте событие OnProgress и запишите в нём всего одну строчку — вынужденную перерисовку сцены: GLSceneViewer1.Invalidate; Готовый пример: http://www.glscene.ru/download.php?view.533 Вот здесь: http://www.uraldev.ru/articles/id/23 есть ещё очень много шейдерных пост-эффектах. Читайте, изучайте и удачи!
|
|||||
Последнее изменение этой страницы: 2016-04-19; просмотров: 470; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.72.125 (0.009 с.) |