"А ларчик просто открывался". Гиперболоид! Цена вопроса - два вызова distance(), ну еще и третий для затухания луча по отдалению от источника.
Код для shadertoy:
void mainImage(out vec4 fragColor, in vec2 fragCoord ) { vec2 p = fragCoord/iResolution.xy; p.x *= iResolution.x/iResolution.y; // ---------------------------------- float d = 0.1; // + 0.3*fract(iTime*1.0); // 0.0 - 90 deg // 0.7 - 45 deg // 0.96 - 15 deg // 1.0 - 0 deg const float cone_halfwidth = 0.6; // 1.0 - sharp // 1.5 - smooth // 1.9 - smoother // ... const float cone_edge_smooth_factor = 1.8; vec2 c1 = vec2( 0.3, 0.3); vec2 dir = normalize( vec2( 1.0, 0.5)); vec2 c2 = c1 - d*dir; // ------------------------------ // Move by mouse /* c2 = iMouse.xy / iResolution.xy; d = distance(c1, c2); */ float r_scale = smoothstep( d*cone_halfwidth, d*cone_halfwidth*cone_edge_smooth_factor, distance( p, c2) - distance( p, c1)); float radius = 1.2; r_scale = r_scale * smoothstep( radius*1.1, radius*0.05, distance( p, c1)); //r_scale = pow(r_scale, 0.1); // <--- shape test // ----------------------------------- float o = r_scale; fragColor = vec4( o, o, o, 1.0); if ( distance( p, c1) < 0.02) { fragColor = vec4( 1.0, 0.0, 0.0, 1.0); } if ( distance( p, c2) < 0.02) { fragColor = vec4( 1.0, 1.0, 0.0, 1.0); } }
vec2 dir = normalize(vec2(1.0, 0.5));
Ты серьёзно ? Зачем normalize ?
float d = 0.1; vec2 c1 = vec2(0.3, 0.3); vec2 dir = normalize( vec2( 1.0, 0.5)); vec2 c2 = c1 - d*dir;
Суслик бы тебя, за такое забанил бы :)))
vec2 c2 = vec2(0.3, 0.3)-vec2( 0.08944,0.04472);
Скрин давай как вышло.
Или ссылку на shadertoy.
ronniko
> Ты серьёзно ? Зачем normalize ?
Чтобы не считать руками. Это ж тестовый код для экспериментов. В настоящем проекте в шейдере вообще нет этих строк, фокальные точки считаются заранее и передаются в шейдер уже готовые (как и всё остальное, что можно заранее рассчитать).
> Скрин давай как вышло.

Прикольно.
У тебя как point light + псевдо объем.
Объём не псевдо, он настоящий. Это половинка настоящего двухполостного гиперболоида.
Гиперболоид инженера Гарина (1965) :)
Я сделяль.
120 fps нативно на Oculus Quest 2 (Snapdragon XR2 и 1440x1520 в каждый глаз). В кадре может быть до 4 объёмных конусов + 5 объёмных сфер (либо 8 конусов, либо 3 конуса и 8 сфер). Сейчас на сцене 3 конуса и 0 сфер. Объёмы настоящие, в них можно поместить камеру.


romanshuvalov
Очень достойно выглядит! Читал вашу ветку от начала, ради интереса. Много проделанной работы. Очень хотелось бы увидеть как же выглядит объемный свет с камерой изнутри – анимацию или хотя бы скриншот. А насколько Snapdragon XR отличается от обычных мобильных чипов в производителтности, если говорить обобщенно, а не исходя из узкой специализации?
Riffmach
> как же выглядит объемный свет с камерой изнутри
Просто всё светлое. Представь, что находишься в облаке дыма.
> А насколько Snapdragon XR отличается от обычных мобильных чипов в производителтности
XR2 по грубым прикидкам сопоставим с GTX1050, но с сильно низким филлрейтом.
А бывает shadertoy для 3д, чтобы удобно шейдером поделиться? А то меня уже спрашивают.
romanshuvalov
А что с клиппингом сквозь стены? Дептх препасс делаешь?
Battle Angel Alita
> А что с клиппингом сквозь стены? Дептх препасс делаешь?
Если я правильно понял, то это решалось еще с тех времён, когда появился Z буфер, отсечением перекрываемых пикселей при филлинге, но это не точно.
Battle Angel Alita
У меня есть depth пикселя и приблизительный depth точки внутри объема. Smoothstep-аю их и получаю мягкий софтовый depth test без дополнительных проходов. Возможно просачивание света сквозь очень тонкие стены, если расположить их рядом с источником.
P. S. Повторяю, чтоб не потерялось: А бывает shadertoy для 3д, чтобы удобно шейдером поделиться? А то меня уже спрашивают.
romanshuvalov
Круто теперь тоже самое для омни лайтов
romanshuvalov
> P. S. Повторяю, чтоб не потерялось: А бывает shadertoy для 3д, чтобы удобно
> шейдером поделиться? А то меня уже спрашивают.
Звучит как идея для стартапа :)
Тема в архиве.