Перейти к содержимому

Почему сложно получить трехмерную модель стеклянной поверхности

  • автор:

Как сделать стекло в 3ds Max

Создание реалистичных материалов — это весьма трудоемкая задача в трехмерном моделировании по той причине, что дизайнер обязан учитывать все тонкости физического состояния материального объекта. Благодаря плагину V-Ray, используемому в 3ds Max, материалы создаются быстро и натурально, так как о всех физических характеристиках плагин уже позаботился, оставляя моделлеру только творческие задачи.

В этой статье будет небольшой урок по быстрому созданию реалистичного стекла в V-Ray.

Как создать стекло в V-Ray

Стекло 3ds Max 1

  1. Запустите 3ds Max и откройте какой-либо смоделлированный объект, в котором будет применяться стекло.

Установка V-Ray на компьютер его назначение рендерером описаны в статье: Настройка освещения в V-Ray

  • В верхней части панели редактора материалов нажмите кнопку «Show Background in preview». Это поможет нам контролировать прозрачность и отражение стекла. Стекло в 3ds Max 3
  • Справа, в настройках материала, впишите название материала.
  • В окне Diffuse щелкните на сером прямоугольнике. Это цвет стекла. Выберите цвет из палитры (желательно выбрать черный цвет). Стекло в 3ds Max 4
  • Переходим в Бокс «Reflection» (Отражение). Черный прямоугольник напротив надписи «Reflect» означает, что материал абсолютно ничего не отражает. Чем ближе этот цвет будет к белому, тем больше будет отражающая способность материала. Установите цвет, близкий к белому. Поставьте галочку в чекбокс «Fresnel reflection», чтобы прозрачность нашего материала менялась в зависимости от угла зрения. Стекло в 3ds Max 5
  • В строке «Refl Glossiness» установите значение 0,98. Это задаст яркий блик на поверхности.
  • В боксе «Refraction» (преломление) мы задаем уровень прозрачности материала по аналогии с отражением: чем белее цвет, тем явнее прозрачность. Установите цвет, близкий к белому.
  • «Glossiness» с помощью этого параметра регулируйте матовость материала. Значение, близкое к «1» — полная прозрачность, чем дальше — тем большую матовость имеет стекло. Поставьте значение 0,98.
  • IOR — один самых важных параметров. Он представляет коэффициент преломления. В интернете можно найти таблицы, где этот коэффициент представлен для разных материалов. Для стекла он составляет 1,51.

Таким образом, мы научились создавать простое стекло. Со временем, вы будете сможете более сложные и реалистичные материалы!

Создаем стекло

Многие 3D дизайнеры в своих работах используют предметы из стекла, но добиться по настоящему реалистично выглядящего стекла удается не многим.
Это связанно, прежде всего, с тем, что изделия из стекла настолько часто попадаются нам на глаза, что не составляет большого труда определить компьютерную подделку. В этой статье я расскажу вам, как сделать «стеклянное» стекло в программе 3D Studio MAX. Изложение материала ориентированно на средний уровень знания пакета, т.е. я не буду подробно рассказывать где найти то или иное меню. Если же у вас возникли затруднения, то обратитесь к справочной системе и посмотрите сцену.
Не торопитесь запускать любимую программу, в самом начале немного теории и пока я тут строю графики и рисую диаграммы вы, пожалуйста сходите на кухню и принесите стакан а еще лучше предварительно вымойте его с мылом т.к. чтобы запачкать виртуальный мир нужно очень сил и ресурсов, и я расскажу об этом как ни будь в другой раз. Когда вспоминают свойства стекла первое что приходит на ум это прозрачность и преломление, к сожалению многие этим и ограничиваются. Для того чтобы реализовать эти простые свойста в МАХе предусмотренно несколько способов. Вот они:
* Карта Refract/Reflect
* Карта рефракции в тонкой пластине
* Карта Raytrace
* Материал Raytrace

Первые две карты мы отметаем сразу, так как в этих случаях качество принесено в жертву скорости. Карта Raytrace и материал Raytrace по многим параметрам схожи, в частности для расчета отражения и приломления они моделируют реальное поведение световых лучей и изображения полученное с их помощью, при умелой настройке, фантастически реально. Мы будем использовать материал Raytrace так как в отличии от карты у него есть несколько дополнительных параметров без которых нам не удаться добиться реализма. Посмотрите внимательно на характер изменения прозрачности, вы заметили, что к краям она спадает? Это потому, что лучам света приходится проходить сквозь большое количество стекла. Теперь рассмотрим, как распределяется отражение по поверхности стакана, если вы внимательны, то должны заметить усиление отражения от центра к краям. Если не догадываетесь, почему так происходит, то обратитесь к учебнику физики. Следует также упомянуть о таком чисто компьютерном параметре как количество переотражений / приломлений, в реальной жизни они стремятся к бесконечности, но так как скорость компьютеров не бесконечна, то все программы ограничивают этот параметр очень не большим числом, в МАХе например по умолчанию стоит 9. Для моей сцены вполне хватило и 5, а вот установив меньшее значение, вы значительно проиграете в реализме т.к. именно 5 переотражений позволяют нам увидеть, что отражается на задней стенке стакана. Реально это выражается в виде цветовых пятен на поверхности стекла, которые и придают ей «живой вид». Из основных параметров хотелось бы также упомянуть о бликах, они у стекла жесткие и обусловненно свойствами материала, яркие, что сравните для примера блики на металлической поверхности и резиновом мячике.
Если вы еще не уснули, спешу вас обрадовать, мы приступаем к практике.
«Джентльмены заводите моторы», ну в смысле пора включать комп и запускать 3D MAX.
Приступим, сначала нам нужно создать стакан, проще всего это сделать так, нарисуйте профиль стакана, только учтите у него должно быть две стороны и примените к нему модификатор Lathe, только не скупитесь на количество фейсов.Я в своей сцене использовал NURBS так как он даёт более качественый результат.

Вот у вас и получился простой стакан, можете поработать над ним еще немного добавляя детали, а затем нужно создать ему окружающую среду. Создайте небольшой BOX и поместите его под стакан, пусть это будет стол. Также установите на стол еще несколько простых примитивов, у меня это: сфера, пирамида и непонятная загогулина для общего разнообразия. Разместите эти объекты спереди и сзади стакана, что бы было видно, как он умеет отражать и преломлять. Еще следует создать один большой BOX такого размера, чтобы в него поместилась все ваша сцена, это будет комната, примените к нему модификатор NORMAL и устоновите галочку FLIP. Осталось настроить камеру и расставить свет, я думаю трех точечной схемы освещения будет достаточно.

Пора приступить к материалам, для начала назначьте всем вспомогательным объектам несложные текстуры.
А теперь займемся нашим главным героем.
Создадим Double Sided материал, на роль facing материала назначим Raytrace материал, и перенесем его на Back выбрав при этом способ копирования как образец.

Использование Double Sided материала необходимо потому что переключатель 2-Sided в материале Raytrace неработает,для справки смотри readme.rtf который находится в катологе с МАХом, а без этого вы потеряете часть деталей, хотя сильно выиграете во времени.
Щелкнув на facing материале, вы окажитесь в настройках котырые и определяют внешний вид вашего стекла.

Начнем сверху вниз. В качестве алгоритма тонирования выберите Fong, он дает более жесткие блики. Справа поставьте галочку Super Sampling, она помогает избежать визуальных артефактов, но так как сильно замедляет расчет сцены, то на этапе тестирования, ее можно отключить. В качестве цвета диффузии выберите серый с интенсивностью 127. В строчке Reflect, выберите небольшое значение интенсивности, 45 вполне хватит, это будет минимальный уровень отражения. Щелкните на пустующей кнопке справа, что бы назначить на канал отражения карту Falloff, важно чтобы Front Colour был черный, а Back белый, в качестве алгоритма смешивания выберите Fresnel. это и обеспечит усиление отражения к краям стакана.

Поднимитесь на уровень вверх и скопируйте только что созданную карту на канал Transparency. Выберите в качестве базового цвета для прозрачности белый, с интенсивностью 250. Теперь подстройте карту Falloff для канала прозрачности таким образом чтобы Front Colour был белый, а Back черный, это обеспечит спад прозрачности к краям стакана.
Установите IOR равным 1.5, и перенесите карту прозрачности на карту IOR, указав при этом способ копирования как Copy. В настройках этого канала поставьте галочку Overdrive IOR и установите значение равным 1.6 или чуть больше, это обеспечит более сильное преломление света на краях стакана.
Теперь настроим блики. Выставите значения параметров Shinimess и Shinimess Strength как 80 и 180 соответственно. Раскройте свиток Extended Parameters и найдите параметр Translucency, установите значение цвета, Value не более 40. Этот параметр отвечает за рассевание света в стекле и позволяет реализовать такие материалы как: замерзшее стекло, рисовая бумага или свечной воск. Далее наш путь лежит в Raytracer Control, щелкните на Global Parameters и установите количество переотражений равным 5, впрочем, если у вас очень мощный компьютер то можете оставить 9, и пойти спать.
Поставе галочку в разделе Global Ray AntiAliaser и нажмите Close. Позже в этом разделе поиграйте с параметрами размытия. Раскройте свиток Maps, и в цифровых полях на против каналов отражения и преломления введите значение 50, это позволит ослабить влияние карты Falloff.
Все что теперь нужно это поставить сцену на просчет и в зависимости от мощности компьютера пойти выпить чашечку кофе или уехать с друзьями на рыбалку. Для более тонкой настройки вам следует подобрать параметры карты Falloff в частности Mix Curve, а также степень ее влияния на отражения и преломления.

Эти параметры зависят от толщены стекла вашего стакана, нужно добиться такого эффекта, чтобы стенки стакана были слегка темные. Чтобы ускорить процесс настройки я рекомендую назначить карту Falloff не на канал прозрачности, а в качестве диффузного цвета стандартного материала это позволит значительно ускорить процесс настройки Mix Curve и за тем скопируйте карту в канал отражения или преломления. Впрочем, предварительных расчетов для тонкой настройке не избежать, поэтому на это время отключите AntiAliaser, что значительно ускорит процесс. Не пере усердствуйте с параметром Translucency так как он слишком размывает изображение и для обычного стекла его значение не должно превышать 95. Если в результате рендеринга на изображении видны черные точки размером с 1 пиксель, то либо уменьшите параметр размытия в настройках AntiAliaser, либо измените фильтр с Fast на MultiResolution и в настройках аккуратно увеличьте начальное и максимальное количество лучей. Будьте аккуратны с этими настройками, так как они катастрофически влияют на время расчета. Если у вас в запасе нет свободной вечности, то закрасьте в ручную эти пиксели в программе Adobe PhotoShop или аналогичной, впрочем если вы настолько безумны что создаете с Raytrace эффектами анимацию, то этот путь не для вас. Как видно создание реалистичного стекла не такая уж трудная задача.

P.S.: Настала пора внести пару бочек дектя в ложку мёда.

Присмотритесь внимательно к изображению. Что то не так, верно? Это «не так», называется тень, к большому сожалению стандартный рендер МАХа до сих пор имеет большие проблемы с тенями. Тут и отсутствие Soft Ray Traced Shadow, и что более всего раздражает так это отсутствие влияния на тень оптических свойств материала, в данном случаи стакан работает как линза и тень должна была это учесть.Поэтому пока без Plugins не обойтись, впрочем не давно состоявшийся релиз Мental ray 2.1 для работы совместно с МАХом вселяет оптимизм и надежду на получение действительно на 100% фотореалистичных изображений.

Создание материала стекла

Многие 3D дизайнеры в своих работах используют предметы из стекла, но добиться по настоящему реалистично выглядящего стекла удается не многим.
Это связанно, прежде всего, с тем, что изделия из стекла настолько часто попадаются нам на глаза, что не составляет большого труда определить компьютерную подделку. В этой статье я расскажу вам, как сделать «стеклянное» стекло в программе 3D Studio MAX. Изложение материала ориентированно на средний уровень знания пакета, т.е. я не буду подробно рассказывать где найти то или иное меню. Если же у вас возникли затруднения, то обратитесь к справочной системе и посмотрите сцену.
Не торопитесь запускать любимую программу, в самом начале немного теории и пока я тут строю графики и рисую диаграммы вы, пожалуйста сходите на кухню и принесите стакан а еще лучше предварительно вымойте его с мылом т.к. чтобы запачкать виртуальный мир нужно очень сил и ресурсов, и я расскажу об этом как ни будь в другой раз. Когда вспоминают свойства стекла первое что приходит на ум это прозрачность и преломление, к сожалению многие этим и ограничиваются. Для того чтобы реализовать эти простые свойста в МАХе предусмотренно несколько способов. Вот они:
* Карта Refract/Reflect
* Карта рефракции в тонкой пластине
* Карта Raytrace
* Материал Raytrace

Первые две карты мы отметаем сразу, так как в этих случаях качество принесено в жертву скорости. Карта Raytrace и материал Raytrace по многим параметрам схожи, в частности для расчета отражения и приломления они моделируют реальное поведение световых лучей и изображения полученное с их помощью, при умелой настройке, фантастически реально. Мы будем использовать материал Raytrace так как в отличии от карты у него есть несколько дополнительных параметров без которых нам не удаться добиться реализма. Посмотрите внимательно на характер изменения прозрачности, вы заметили, что к краям она спадает? Это потому, что лучам света приходится проходить сквозь большое количество стекла. Теперь рассмотрим, как распределяется отражение по поверхности стакана, если вы внимательны, то должны заметить усиление отражения от центра к краям. Если не догадываетесь, почему так происходит, то обратитесь к учебнику физики. Следует также упомянуть о таком чисто компьютерном параметре как количество переотражений / приломлений, в реальной жизни они стремятся к бесконечности, но так как скорость компьютеров не бесконечна, то все программы ограничивают этот параметр очень не большим числом, в МАХе например по умолчанию стоит 9. Для моей сцены вполне хватило и 5, а вот установив меньшее значение, вы значительно проиграете в реализме т.к. именно 5 переотражений позволяют нам увидеть, что отражается на задней стенке стакана. Реально это выражается в виде цветовых пятен на поверхности стекла, которые и придают ей «живой вид». Из основных параметров хотелось бы также упомянуть о бликах, они у стекла жесткие и обусловненно свойствами материала, яркие, что сравните для примера блики на металлической поверхности и резиновом мячике.
Если вы еще не уснули, спешу вас обрадовать, мы приступаем к практике.
«Джентльмены заводите моторы», ну в смысле пора включать комп и запускать 3D MAX.
Приступим, сначала нам нужно создать стакан, проще всего это сделать так, нарисуйте профиль стакана, только учтите у него должно быть две стороны и примените к нему модификатор Lathe, только не скупитесь на количество фейсов. Я в своей сцене использовал NURBS так как он даёт более качественый результат.

Вот у вас и получился простой стакан, можете поработать над ним еще немного добавляя детали, а затем нужно создать ему окружающую среду. Создайте небольшой BOX и поместите его под стакан, пусть это будет стол. Также установите на стол еще несколько простых примитивов, у меня это: сфера, пирамида и непонятная загогулина для общего разнообразия. Разместите эти объекты спереди и сзади стакана, что бы было видно, как он умеет отражать и преломлять. Еще следует создать один большой BOX такого размера, чтобы в него поместилась все ваша сцена, это будет комната, примените к нему модификатор NORMAL и устоновите галочку FLIP. Осталось настроить камеру и расставить свет, я думаю трех точечной схемы освещения будет достаточно.

Пора приступить к материалам, для начала назначьте всем вспомогательным объектам несложные текстуры.
А теперь займемся нашим главным героем.
Создадим Double Sided материал, на роль facing материала назначим Raytrace материал, и перенесем его на Back выбрав при этом способ копирования как образец.

Использование Double Sided материала необходимо потому что переключатель 2-Sided в материале Raytrace неработает, для справки смотри readme.rtf который находится в катологе с МАХом, а без этого вы потеряете часть деталей, хотя сильно выиграете во времени.
Щелкнув на facing материале, вы окажитесь в настройках котырые и определяют внешний вид вашего стекла.

Начнем сверху вниз. В качестве алгоритма тонирования выберите Fong, он дает более жесткие блики. Справа поставьте галочку Super Sampling, она помогает избежать визуальных артефактов, но так как сильно замедляет расчет сцены, то на этапе тестирования, ее можно отключить. В качестве цвета диффузии выберите серый с интенсивностью 127. В строчке Reflect, выберите небольшое значение интенсивности, 45 вполне хватит, это будет минимальный уровень отражения. Щелкните на пустующей кнопке справа, что бы назначить на канал отражения карту Falloff, важно чтобы Front Colour был черный, а Back белый, в качестве алгоритма смешивания выберите Fresnel. это и обеспечит усиление отражения к краям стакана.

Поднимитесь на уровень вверх и скопируйте только что созданную карту на канал Transparency. Выберите в качестве базового цвета для прозрачности белый, с интенсивностью 250. Теперь подстройте карту Falloff для канала прозрачности таким образом чтобы Front Colour был белый, а Back черный, это обеспечит спад прозрачности к краям стакана.
Установите IOR равным 1.5, и перенесите карту прозрачности на карту IOR, указав при этом способ копирования как Copy. В настройках этого канала поставьте галочку Overdrive IOR и установите значение равным 1.6 или чуть больше, это обеспечит более сильное преломление света на краях стакана.
Теперь настроим блики. Выставите значения параметров Shinimess и Shinimess Strength как 80 и 180 соответственно. Раскройте свиток Extended Parameters и найдите параметр Translucency, установите значение цвета, Value не более 40. Этот параметр отвечает за рассевание света в стекле и позволяет реализовать такие материалы как: замерзшее стекло, рисовая бумага или свечной воск. Далее наш путь лежит в Raytracer Control, щелкните на Global Parameters и установите количество переотражений равным 5, впрочем, если у вас очень мощный компьютер то можете оставить 9, и пойти спать.
Поставе галочку в разделе Global Ray AntiAliaser и нажмите Close. Позже в этом разделе поиграйте с параметрами размытия. Раскройте свиток Maps, и в цифровых полях на против каналов отражения и преломления введите значение 50, это позволит ослабить влияние карты Falloff.
Все что теперь нужно это поставить сцену на просчет и в зависимости от мощности компьютера пойти выпить чашечку кофе или уехать с друзьями на рыбалку. Для более тонкой настройки вам следует подобрать параметры карты Falloff в частности Mix Curve, а также степень ее влияния на отражения и преломления.

Создание материала стекла Cr10

Эти параметры зависят от толщены стекла вашего стакана, нужно добиться такого эффекта, чтобы стенки стакана были слегка темные. Чтобы ускорить процесс настройки я рекомендую назначить карту Falloff не на канал прозрачности, а в качестве диффузного цвета стандартного материала это позволит значительно ускорить процесс настройки Mix Curve и за тем скопируйте карту в канал отражения или преломления. Впрочем, предварительных расчетов для тонкой настройке не избежать, поэтому на это время отключите AntiAliaser, что значительно ускорит процесс. Не пере усердствуйте с параметром Translucency так как он слишком размывает изображение и для обычного стекла его значение не должно превышать 95. Если в результате рендеринга на изображении видны черные точки размером с 1 пиксель, то либо уменьшите параметр размытия в настройках AntiAliaser, либо измените фильтр с Fast на MultiResolution и в настройках аккуратно увеличьте начальное и максимальное количество лучей. Будьте аккуратны с этими настройками, так как они катастрофически влияют на время расчета. Если у вас в запасе нет свободной вечности, то закрасьте в ручную эти пиксели в программе Adobe PhotoShop или аналогичной, впрочем если вы настолько безумны что создаете с Raytrace эффектами анимацию, то этот путь не для вас. Как видно создание реалистичного стекла не такая уж трудная задача.

Создание материала стекла Glass10

P.S.: Настала пора внести пару бочек дектя в ложку мёда.

Присмотритесь внимательно к изображению. Что то не так, верно? Это «не так», называется тень, к большому сожалению стандартный рендер МАХа до сих пор имеет большие проблемы с тенями. Тут и отсутствие Soft Ray Traced Shadow, и что более всего раздражает так это отсутствие влияния на тень оптических свойств материала, в данном случаи стакан работает как линза и тень должна была это учесть. Поэтому пока без Plugins не обойтись, впрочем не давно состоявшийся релиз Мental ray 2.1 для работы совместно с МАХом вселяет оптимизм и надежду на получение действительно на 100% фотореалистичных изображений.

Моделирование стеклянных поверхностей

С помощью современных графических адаптеров можно получать все более сложные динамические сцены. Это означает, что высококачественный (фотореалистичный) рендеринг переноситься из offline в реальное время. В частности, одной из насущных задач компьютерной графики является расчет и рендеринг глобального освещения и сложных материалов. В этой статье я хотел бы рассказать о моделировании стеклянных предметов.

Введение

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

glass_rendering1 | Моделирование стеклянных поверхностей

Стекло. Что же мы будем моделировать

Итак, что же нам предстоит сделать для того, чтобы получить реалистичное стекло?

Основное, что делает стекло стеклом – это его прозрачность. То есть стекло преломляет и пропускает лучи света (но при этом, конечно же, не стоит забывать и то, что стекло также и отражает свет), позволяя видеть (хотя и в искаженном виде за счет преломления) предметы, находящиеся за стеклянным предметом, по отношению к наблюдателю.

Также следует с осторожностью подойти к выбору модели освещения стекла. От правильно выбранной модели освещения зависит очень многое. Так, например, если выбрать модель освещения Кука-Торренса – мы получим гладкое полированное стекло, а если выбрать модель Фонга — то стекло уже не будет казаться полированным. Но в статье я остановлю свой выбор именно на модели освещения Кука-Торренса.

Еще одна важная часть моделирования стекла — это каустика. Те самые светлые пятна, которые образуются при концентрации лучей света на небольшой площади вследствие их преломления (отклонения от начальной траектории) на границе материала. Да, кстати, каустика относится уже к моделированию глобального освещения.

Итак, четыре компонента, которые делают стекло стеклом в компьютерной графике:

1. Прозрачность
2. Отражения
3. Освещение
4. Каустика

Ну что же, начнем моделирование нашего стекла. Да, кстати я забыл сказать, что для моделирования я выбрал OpenGL 3.2. По ходу дела, я, конечно же, буду объяснять, как сделать тот или иной эффект с помощью этого графического API и где это потребуется, будет приведен исходный код непосредственно на С++, а также все необходимые шейдеры. Также я полагаю, что читатель знаком с основами OpenGL и сможет самостоятельно провести некоторую подготовку (сделать простенькую сцену с одним точечным источником света), а также знаком с технологией использования Framebuffer Object.

Итак, мы начинаем!

Прозрачность стекла

Собственно прозрачность объекта можно смоделировать относительно легко. Достаточно нарисовать из центра моделируемого объекта кубическую карту, а затем делать выборки из неё в правильных направлениях. До относительно недавнего времени, получить динамическую кубическую карту в OpenGL можно было шесть раз отрисовав сцену в каждую из граней кубической текстуры. Но с появлением в ядре OpenGL 3.2 геометрических шейдеров все стало намного проще. Достаточно один раз нарисовать сцену, все остальное за нас сделает геометрический шейдер. Но давайте все же действовать по порядку. Итак, представьте себе, что у нас есть сцена, а лучше давайте сразу договоримся о том, что она у нас есть. У меня в примере — это комната, с расставленными в ней случайным образом ящиками. Рисуется это все очень просто, но постепенно мы будем добавлять в отрисовку сцены новые пункты.

Теперь самое время перейти к созданию кубической карты для нашего стекла. Рассмотрим два подхода – первый будет с шестью отрисовками в грани кубической карты, а второй — с геометрическим шейдером. Далее и везде я буду использовать Framebuffer Object для отрисовки в любую текстуру. Надеюсь читатель уже знаком с этой технологией и мне придется только лишь добавить некоторые моменты, относительно рендеринга в кубическую карту.

Итак, для того чтобы получить кубическую карту с использованием шести проходов отрисовки, нам будет необходимо: создать саму кубическую текстуру, создать Framebuffer Object, который будет отвечать за отрисовку в созданную кубическую карту, и выполнить отрисовку сцены в неё. Кубическая карта создается следующим образом:

Код для создания объекта Framebuffer Object используем стандартный (помните, я рассчитываю на то, что вы уже знакомы с ним, во всяком случае, описывать создание FBO – это не та задача, которая поставлена в данной статье).

И еще один важный момент – настроить матрицы преобразования так, чтобы камера охватывала все окружение (360°). Для этого нам нужно настроить матрицу проекции (projection matrix) так, чтобы FOV равнялся 90°. Приведу фрагмент исходного кода, который создает матрицу проекции:

Теперь у нас есть матрица проекции, но нам нужны еще шесть видовых матриц, с помощью которых наша камера «смотрела» бы в разные стороны (±X, ±Y, ±Z). Получить эти матрицы можно простым умножением проективной матрицы на матрицу поворота на соответствующие углы, а можно просто (что при этом даст тот же результат) переставить местами (конечно, не случайным образом) строки проективной матицы. Я однажды делал это, а теперь поделюсь с вами 🙂
Следующий код генерирует 6 матриц для отрисовки в кубическую карту из заданной позиции:

Ну вот, теперь у нас есть все, чтобы нарисовать в кубическую карту вашу сцену. Делается это примерно следующим образом:

С первым методом, кажется, все ясно. А как же быть с отрисовкой в кубическую карту, с использованием геометрического шейдера? Давайте разбираться с этим. При таком подходе нам понадобится Framebuffer Object, к которому присоединена не обычная 2D текстура, а кубическая карта. Так, если для присоединения 2D текстуры мы использовали метод glFramebufferTexture2D, то теперь нам необходимо использовать метод glFramebufferTexture, который позволяет присоединить к объекту Framebuffer Object любую текстуру – будь то 1D, 2D, 3D текстура или же кубическая карта.

Теперь самое интересное — геометрический шейдер. Суть его в том, что он будет создавать новые треугольники и проецировать их на каждую из шести граней кубической карты. Для этого будем использовать в геометрическом шейдере встроенную переменную gl_Layer, которая позволяет выбрать слой (грань) многослоевой текстуры (кубической карты), в который мы будем выводить примитивы. Для того чтобы треугольники корректно проецировались на грани кубической карты, нам нужно будет передать в геометрический шейдер шесть матриц, которые были успешно рассчитаны ранее.

Теперь рассмотрим шейдеры, которые используются для отрисовки окружения по порядку:

Вершинный шейдер. Я использовал препроцессор, для того чтобы не размножать шейдеры, а скомпоновать все в один, с четко определенным функционалом. Директива «WITH_GS» используется для того, чтобы определить – используется ли геометрический шейдер или нет. Если не используется (то есть следом за вершинным сразу идет фрагментный шейдер), значит, мы как обычно проецируем нашу вершину и передаем требуемые значения (нормаль, текстурные координаты и т.д.) сразу во фрагментный шейдер. Если же используется геометрический шейдер, то нам необходимо передать в него исходную вершину и требуемые значения, а он уже в свою очередь сделает все необходимое и передаст управление фрагментному шейдеру. Итак, вот он наш вершинный шейдер:

Теперь давайте рассмотрим геометрический шейдер.

Фрагментный шейдер мы пока оставляем без изменений. А вот отрисовка в данном случае будет следующей:

Как видите — нам нужна только одна отрисовка вместо шести.

Конечно, возникает вопрос «А что быстрее?. Рисовать 6 раз в каждую из граней, либо один раз, но с увеличением числа треугольников в геометрическом шейдере?». На самом деле скорость работы практически одинакова, но вариант с геометрическим шейдером мне нравится больше из-за меньшего размера кода и его «красоты».

Кубическая карта у нас готова (первым или вторым способом). Теперь можно наложить её на объект и посмотреть, что же из этого выйдет. Предлагаю начать с простого шейдера и постепенно наращивать функционал, увеличивая качество изображения. Для начала надо сказать, что при рендеринге стекла нам нужно забыть об освещении Ламберта (это то, которое dot(light, nomal)). Так как в этом разделе речь пойдет только о правильном наложении кубической карты, то я пока опущу и бликовое освещение, и перейдем непосредственно к делу. Итак, у нас есть кубическая карта, отрендеренная из центра объекта. В шейдерах выборка из такой текстуры происходит следующим образом:

где direction – трехкомпонентный вектор, по которому определяется грань кубической карты и текстурные координаты на этой грани.

Предлагаю рассмотреть наложение кубической карты на сферу, так как стеклянный шарик есть практически у каждого, и вы сами сможете использовать его как некий эталон. Давайте для начала в качестве направления выборки (вектора direction) используем нормаль на сфере – таким образом можно проверить – правильно ли мы отрисовали нашу кубическую карту. При таком наложении мы увидим объекты так, как бы мы их видели из центра шара в направлении нормали:

glass_rendering2 | Моделирование стеклянных поверхностей

Надеюсь, у вас сразу получилось правильно отрисовать кубическую карту и теперь можно перейти к более сложному алгоритму. Давайте еще раз вспомним – что мы собственно хотели от кубической карты? Это отражения и преломления. Давайте попробуем наложить кубическую карту так, чтобы сфера отражала лучи света. Хорошо, что в GLSL есть встроенная функция reflect, которая принимает два параметра — направление луча и нормаль к плоскости, от которой луч света отражается. Разработчики GLSL избавили нас от необходимости самостоятельного вычисления отраженного вектора по формуле:

R = I – 2·dot(N, I)·N

где I (incidence) – падающий луч, N (normal) – нормаль.

Итак, рассчитаем отраженный вектор и сделаем выборку из кубической карты.

Следует заметить, что вектор взгляда должен быть нормированным и вычисляться как vertex – camera, а не наоборот, либо (как в приведенном коде) использовать знак «–» перед вектором взгляда. Думаю это следует пояснить небольшим рисунком:

glass_rendering3 | Моделирование стеклянных поверхностей

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

glass_rendering4 | Моделирование стеклянных поверхностей

Теперь, думаю, самое время исследовать преломление лучей света. Как известно из курса физики (если не ошибаюсь, это есть даже в школьной программе) луч света преломляется на границе двух сред по закону Снелла:

где n1,2 — абсолютные показатели преломления материала (отношение скорости света в среде к скорости света в вакууме);
ϑ1,2 — углы между нормалью и соответственно падающим лучом и преломленным.

Мы рассматриваем случай, когда луч света переходит из воздуха (n1≈1.0) в стекло (n2≈1.4). Относительный показатель преломления η будет равен n1/n2≈0.7. Вот мы и добрались до относительного показателя преломления. Именно он используется во встроенной функции GLSL refract, которая принимает три параметра – падающий луч, нормаль и показатель преломления.

Результатом будет вот такая картинка:

glass_rendering5 | Моделирование стеклянных поверхностей

Итак, отражения и преломления у нас есть, но по отдельности. Как же их совместить? Очень просто. Еще в 1823 году Огюст Френель вывел формулы, с помощью которых можно рассчитать долю отраженной энергии в зависимости от показателя преломления и угла падения луча:

glass_rendering6 | Моделирование стеклянных поверхностей

Сейчас существует множество аппроксимаций для данной формулы, но я же предлагаю использовать оригинальную формулу, только мы её немножко сейчас преобразуем (вы же не думаете, что я предлагаю вам вычислять синусы и косинусы?).

Итак – что же такое cos(Θ)? Это не что иное, как скалярное произведение нормированного вектора взгляда на нормаль в данной точке. Единственное, что хотелось бы сказать – вектор взгляда в данном случае надо вычислять как camera – vertex. С косинусом разобрались, а синус есть не что иное, как корень из (один минус квадрат косинуса). Если умножить и разделить все выражение (под степенью) на его числитель, то получим сверху квадрат числителя, а снизу 1 – η 2 . Теперь формула выглядит значительно проще (кому интересно – могут проделать эти преобразования вручную или в любом математическом пакете). Таким образом, на самом деле нет ничего страшного в этой формуле в вычислительном плане и мы можем вынести вычисление коэффициента Френеля в отдельную функцию вида:

Если вывести коэффициент Френеля в качестве цвета:

то мы увидим следующее:

glass_rendering7 | Моделирование стеклянных поверхностей

glass_rendering8 | Моделирование стеклянных поверхностей

Белые области соответствуют большему отражению света, черные – преломленным лучам.

В общем-то, у нас есть всё, чтобы сделать самое примитивное стекло. Давайте просто смешаем полученные ранее цвета (для отражения и преломленного света) с учетом коэффициента Френеля:

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *