Russian Qt Forum

Qt => OpenGL => Тема начата: Igors от Июнь 05, 2020, 11:02



Название: Стакан воды
Отправлено: Igors от Июнь 05, 2020, 11:02
Добрый день

Как нарисовать (или отшейдить, отрендерить - мы знаем вумные слова) просто-напросто стакан воды?

Что собсно должен делать шейдер для воды (да и для стеклянного стакана, проблемы в принципе те же)? Ведь вода не "белая", а "прозрачная" как помню из школьного учебника. Да, но мы прекрасно видим сколько воды/водки налито в стакан. Или "вода имеет блики" (спекуляр). Так это может быть небольшое пятнышко, а то и вовсе ничего

И как использовать/организовать прозрачность? Многочисленные тьюториалы рекомендуют рисовать "от задних к передним" включая бленд, но как я сделаю это для того же стакана ? Он ведь одна модель, выходит нужно вычислять (на каждом кадре) какие полигоны "задние" (по отношению к камере) - гемор изрядный. Или использовать новую технику (тут ссылка мелькала), но там мало не покажется, причем нужна достаточно современная "карта". Так или иначе уже забот полно, а рез-т пока нулевой.

Как же так, мы вооружились до зубов современными технологиями и отдали не одну сотню баксов за "карточку", а выxодит что простейшую, элементарную задачу делать нечем  :'(

Или может я "не по адресу", тут "таким не занимаются", нужно спрашивать в др месте, напр на гамдев (где много спецов). Ну глянем что там на эту тему, вот напр
Цитировать
Ну что же вы все так и пытаетесь мне на вредить, я то думал что вы и в правду решили мне помочь но аказывается выслали на почту черт пойми что. Так я и непонел что там было. Иероглефы какие-то.
НО я посмотрел эту книгу. Скучноватая и пошейдарам там неособо много примеров. пробывал прикрутиь к примерам свой шейдер ничего не получилось. НО все равно интересная книга буду читать.
Ванька Жуков писал значительно лучше.

Ну ладно, так как же все-таки сделать стакан воды?

Спасибо


Название: Re: Стакан воды
Отправлено: ViTech от Июнь 06, 2020, 13:09
А вода из-под крана или из чайника?


Название: Re: Стакан воды
Отправлено: Пантер от Июнь 06, 2020, 14:24
Меня больше интересует полный ли стакан, наполовину полный или наполовину пустой.


Название: Re: Стакан воды
Отправлено: Igors от Июнь 07, 2020, 10:35
Мда, как-то неважно с эрудицией, может сбивает с толку имя раздела. Ну хорошо, а как вообще это сделать? (с OpenGL или без - в принципе  "детали реализации")


Название: Re: Стакан воды
Отправлено: kuzulis от Июнь 07, 2020, 10:46
> Меня больше интересует полный ли стакан, наполовину полный или наполовину пустой.

А может там вообще спирт!


Название: Re: Стакан воды
Отправлено: Пантер от Июнь 07, 2020, 12:14
> Меня больше интересует полный ли стакан, наполовину полный или наполовину пустой.

А может там вообще спирт!
Вот не надо тут, в ТЗ была четко указана вода. И я уверен, что никакой OpenGL не сделает из воды спирт. Был тут один крутой девелопер, который вино из воды мог мутить, но он перешел на другой уровень.


Название: Re: Стакан воды
Отправлено: Igors от Июнь 08, 2020, 10:15
Так бум чего-то пердлагать, или только так, глазками лупать ? :)

Впрочем, спецы тоже не горят желанием думать, тем более делать. Нашелся лишь один паренек которого "зацепило". Вот его пробы (аттач). Ну конечно не perfect, но в общем - молодец. Прозрачность здесь не нужна, он поймал эту идею. Хотя может просто передрал ссылочку (я часто переоцениваю).

Да, собсно воды пока нет. Критикуем (хаем чужую корову).


Название: Re: Стакан воды
Отправлено: kuzulis от Июнь 08, 2020, 10:17
А граненый сбацать слабо?


Название: Re: Стакан воды
Отправлено: Пантер от Июнь 08, 2020, 10:44
Я предлагаю заменить фон на совковую обстановочку, заменить стакан на граненный и налить туда жигулей. Слабо на OpenGL забацать? Могут твои "современные технологии" такое?


Название: Re: Стакан воды
Отправлено: Igors от Июнь 08, 2020, 11:10
Я предлагаю заменить фон на совковую обстановочку, заменить стакан на граненный и налить туда жигулей. Слабо на OpenGL забацать? Могут твои "современные технологии" такое?
Это обычная повседневная работа трехмерщика, к современным технологиям отношения не имеет (как и к данной теме). Хотите граненый стакан? Берете моделер (приложение), в нем есть типовой инструмент revolve (фигура вращения), он делает любые стаканы.  Хотите сменить обстановку - ну ее надо иметь (в виде моделей). Тогда рендерите ее 6 раз, и получившиеся 6 проекций склеиваете (кубиком или крестом). Это если хотите иметь обстановку в виде текстуры (карты отражения). Есть приложения облегчающие этот процесс. Ну или надыбать готовый имедж на просторах инета.

В общем, носить Ваши чемоданы никакие технологии не будут   :)


Название: Re: Стакан воды
Отправлено: Igors от Июнь 09, 2020, 09:53
А ось i варенички
Код:
uniform samplerCube cubemap_texture;
uniform sampler2D lightmap_texture;

uniform vec3 view_position;
uniform vec3 light_source;
uniform mat3 light_matrix;

varying vec3 normal;
varying vec4 vertex;
varying vec3 normal_VS;

varying vec4 proj_coords;

#include "Constants.inc"
#include "CookTorrance.inc"
#include "Postprocess.inc"

const vec3 glass_color = vec3(95.0, 253.0, 215.0) / 255.0;

void main()
{
 vec3 vNormal = -normal;
 vec3 vLight  = light_source  - vertex.xyz;
 vec3 vView   = view_position - vertex.xyz;
 
 float fLightDistance = length(vLight);
 float fScattering    = pow( 1.0 / (1.0 + fLightDistance * 0.0002), 6.0 );
 
 vLight = normalize(vLight);
 vView  = normalize(vView);
 vec2 vLightShading = LightFunction(vNormal, vLight, vView, 0.8925);
 vLightShading.x = 0.8 + 0.2 * vLightShading.x;

 float VdotN    = max(0.0, dot(vView, vNormal));
 float fFresnel = 1.0 / pow(1.0 + VdotN, 3.35);

 vec3 vReflection = textureCube( cubemap_texture, reflect(vView, vNormal) ).xyz;

 float fRefractionR = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA        ) ).r;
 float fRefractionG = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA * 1.018) ).g;
 float fRefractionB = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA * 1.035) ).b;
 vec3  vRefraction  = vec3(fRefractionR, fRefractionG, fRefractionB);

 vec3 vColor = mix(vRefraction, vReflection, fFresnel);
 vColor      = mix( vColor, glass_color * dot(vColor, LUMINANCE_VEC), 1.0 - VdotN );

 vec3 result = (light_matrix[0] * fScattering +
                light_matrix[1] * vLightShading.x) * vColor +
                light_matrix[2] * vLightShading.y ;

 gl_FragColor = vec4( result, 1.0);
}
Фрагмент GLSL кода которым поделился автор. Язык конечно угребочный (для железа), но С-подобный, смысл легко понятен.

Критикуем, улучшаем..


Название: Re: Стакан воды
Отправлено: Пантер от Июнь 09, 2020, 10:22
О, как - вместо стакана какой-то угребочный код подсунули.


Название: Re: Стакан воды
Отправлено: Igors от Июнь 09, 2020, 15:50
О, как - вместо стакана какой-то угребочный код подсунули.
Неужели Вам неизвестно что шейдеры уже лет 10 как священная корова OpenGL? Без них никуда, учить их - долг каждого, даже в Qt они поддерживаются.

Поразбираем код, там несложно, ну вот хотя бы
Код:
 float fRefractionR = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA        ) ).r;
 float fRefractionG = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA * 1.018) ).g;
 float fRefractionB = textureCube( cubemap_texture, -refract(vView, vNormal, GLASS_ETA * 1.035) ).b;
Что это за возня с компонентами RGB и маленькими числами около единички ???


Название: Re: Стакан воды
Отправлено: Apktyc от Июнь 09, 2020, 18:40
Предположим, что GLASS_ETA - IOR воздуха к IOR стакана. А коэффициенты - реализация дисперсии.
Но это не точно.

З.Ы. Жаль автор шейдера удалился с геймдева и не раскрыл его тайны.


Название: Re: Стакан воды
Отправлено: navrocky от Июнь 10, 2020, 18:41
Я думаю с таким надо прямиком топать на shadertoy.com и искать похожие примеры. Ихний местный гуру Inigo Quilez с демо-команды RGBA и основатель этого ресурса охотно помогает советами и даже кодом, когда видит что кто-то мучается с шейдерами и у него это плохо выходит...

Вот еще статья из гугла, вроде как описывает сам процесс и шаги:
https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-19-generic-refraction-simulation


Название: Re: Стакан воды
Отправлено: Igors от Июнь 11, 2020, 11:36
Предположим, что GLASS_ETA - IOR воздуха к IOR стакана. А коэффициенты - реализация дисперсии.
Но это не точно.

З.Ы. Жаль автор шейдера удалился с геймдева и не раскрыл его тайны.
Ну чего он хотел - и так ясно. Пусть карта отражения = белое пятно на черном фоне. Тогда очень может быть что красная компонента "дотянется" до пятна, а зеленая нет (или наоборот), получится нечто типа радуги.

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

Я думаю с таким надо прямиком топать на shadertoy.com и искать похожие примеры. Ихний местный гуру Inigo Quilez с демо-команды RGBA и основатель этого ресурса охотно помогает советами и даже кодом, когда видит что кто-то мучается с шейдерами и у него это плохо выходит...

Вот еще статья из гугла, вроде как описывает сам процесс и шаги:
https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-19-generic-refraction-simulation
Какой энергичный, предприимчивый молодой человек :) Конечно просторы инета безграничны, и вероятность "найти лучшее" есть всегда. Но ведь найденное нужно как-то осмыслить и оценить, как у Вас с этим?  :)

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

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



Название: Re: Стакан воды
Отправлено: Igors от Июнь 15, 2020, 07:02
Как работает карта/текстура "окружения". Считается что любая точка (что мы сейчас шейдим) стоит в центре бесконечно большой сферы/куба на котором наша текстура. Позиция объекта игнорируется, используется только вектор напр-я, он вычисляется в зависимости от использования (view, reflect, refract). Эта работает хорошо в роли sky/background, но для близлежащих объектов нет. Ведь как-то "облететь окружение" или "зайти за него" нельзя,  мы можем только находиться внутри него. Напр на картинках выше злополучная трубочка поведет себя очень странно и быстро исчезнет если облетать стакан камерой слева или справа.

В случае преломления (refract) мы не получим даже корректного sky. Ведь объект имеет по меньшей мере еще одну заднюю стенку которая тоже преломляет и которую тоже надо учитывать. А так получается что мы смотрим на небо сквозь бесконечную толщу стекла.

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

Вот тебе, бабушка, и "технология". Заставили учить встроенный язык, осваивать не маленькое API и его обертки (в том же Qt). Понимаю, если хотим задействовать технологию - ей придется овладеть, надо так надо. Но елы-палы, почему для совершенно стандартной, банальной, повседневной и.т.п. задачи данная технология никаких средств не предоставляет ??? :'(


Название: Re: Стакан воды
Отправлено: navrocky от Июнь 15, 2020, 19:44
Наверное не совсем то, что надо, но это стакан, правда без воды  :)

https://www.shadertoy.com/view/4s2GDV


Название: Re: Стакан воды
Отправлено: Igors от Июнь 16, 2020, 06:34
Наверное не совсем то, что надо, но это стакан, правда без воды  :)

https://www.shadertoy.com/view/4s2GDV
Да, видел там интересные, но увы, они все hard-coded, т.е. модель/специфика стакана вбита в код. Меня бы устроило напр так (https://streamable.com/lysj2w) но видимо придется "закатать губу" :'(