Войти
ПрограммированиеФорумГрафика

Water subsurface scattering

Страницы: 1 2 3 Следующая »
#0
17:52, 23 дек. 2015

Увидел статью про воду в Assassin's Creed Black Flag и меня заинтересовала их техника subsurface scattering.
Помогите осилить вот это:
Ocean Water normally has some SSS but rendering it would be extremely expensive. To provide the effect the team used a simple SSS test based on viewing position, sun position and surface slope, this would then vary localized 'shallowness' or tint/opacity. It is remarkable how effective it is to fake SSS by just making the underside of back lit waves 'less shallow' (tint/transparent).

Очень круто выглядит водичка
Изображение

Насколько я понял surface slope = dot(normal, float3(0, 1, 0)), т.е. фактически это наклон поверхности.
Как его увязать с 'viewing position' и 'sun position'?


#1
17:56, 23 дек. 2015

Bonus
смотри nVidia SDK Island 11

#2
14:29, 24 дек. 2015
Немного оффтопик, но мне на их картинке https://www.fxguide.com/wp-content/uploads/2012/12/SSS.png вода без SSS больше нравится, чем с SSS, с эффектом засвеченное зелёное мыло какое-то (эффект типичной "компьютерной воды")) - не знаю конечно, может в самом движке наоборот. А вообще тема реализации очень интересна, эту статью кстати давно уже видел.
#3
14:34, 24 дек. 2015

DL

SSS создает ощущение прозрачности, имхо. Ну и если настроить по своему вкусу, не так контрастно, должно быть ок. Тем более эта вещь еще должна зависеть от погоды и общего освещения. Например, ночью в шторм его просто не должно быть.
#4
15:53, 24 дек. 2015
Картинка понравилась.
Аж Айвазовский вспомнился:
+ Показать

Потом прочитал описание. Посмотрел ещё раз и мозг такой: "тю, видно же, что фейк".
Хм.

#5
16:09, 24 дек. 2015

чёнить в духе

    float3 viewDir = normalize(worldPos - camPos);
    float invLight = 1-saturate(dot(normal, lightDir));
    float viewMask = pow(saturate(dot(-viewDir, normal)), param);
    float sss = invLight * viewMask * sssColor;

#6
16:18, 24 дек. 2015

Mr F
>чёнить в духе

Да я рабочий source указал, что еще надо для счастья, там можно с параметрами поиграться. А вообще да, логика рядом.

#7
16:32, 24 дек. 2015

Osiris
> Да я рабочий source указал, что еще надо для счастья, там можно с параметрами
> поиграться.

Да, source хороший - я знаком лично с автором :)

Там кроме Ocean surface ещё много чего можно скоммуниздить

#8
16:58, 24 дек. 2015

Osiris
> Да я рабочий source указал, что еще надо для счастья, там можно с параметрами
> поиграться. А вообще да, логика рядом.
Я чуть позже доберусь. На работе MAC и я даже установить не могу SDK, потому что установщик у нвидии .exe))
На домашнем компе поковыряю.

А вообще мне очень нравится как сделаны верхушки волн на скрине из первого поста. Они темнее чем середина волны, получается, что чем сильнее грань повернута к камере тем прозрачнее.

#9
17:19, 24 дек. 2015

innuendo
>Да, source хороший - я знаком лично с автором :)
>Там кроме Ocean surface ещё много чего можно скоммуниздить
Это где же?

#10
17:23, 24 дек. 2015

Synthetic
> Это где же?

Это из кода же

#11
22:07, 24 дек. 2015

Osiris
> , что еще надо для счастья, там можно с параметрами поиграться

Ну да, небольшой такой ps шейдерок на 200 строчек ...

Нужно предлагать в качестве тестового задания :):):)

#12
18:05, 25 дек. 2015

Osiris
> Да я рабочий source указал

ну собственно вот весь эффект из той демки

  // simulating scattering/double refraction: light hits the side of wave, travels some distance in water, and leaves wave on the other side
  // it's difficult to do it physically correct without photon mapping/ray tracing, so using simple but plausible emulation below

  // only the crests of water waves generate double refracted light
  scatter_factor=2.5*max(0,input.positionWS.y*0.25+0.25);

  // the waves that lie between camera and light projection on water plane generate maximal amount of double refracted light 
  scatter_factor*=shadow_factor*pow(max(0.0,dot(normalize(float3(pixel_to_light_vector.x,0.0,pixel_to_light_vector.z)),-pixel_to_eye_vector)),2.0);
  
  // the slopes of waves that are oriented back to light generate maximal amount of double refracted light 
  scatter_factor*=pow(max(0.0,1.0-dot(pixel_to_light_vector,microbump_normal)),8.0);
  
  // water crests gather more light than lobes, so more light is scattered under the crests
  scatter_factor+=shadow_factor*1.5*g_WaterColorIntensity.y*max(0,input.positionWS.y+1)*
    // the scattered light is best seen if observing direction is normal to slope surface
    max(0,dot(pixel_to_eye_vector,microbump_normal))*
    // fading scattered light out at distance and if viewing direction is vertical to avoid unnatural look
    max(0,1-pixel_to_eye_vector.y)*(300.0/(300+length(g_CameraPosition-input.positionWS)));

  // fading scatter out by 90% near shores so it looks better
  scatter_factor*=0.1+0.9*input.depthmap_scaler.g;

Крутая демка, кстати, спасибо!
У меня вопрос, как нормализовать их scatter_factor? В каком диапазоне у них значения? Тут много хардкодных множителей, которые никак не могут дать значение [0..1]

#13
18:37, 25 дек. 2015

Bonus
> ну собственно вот весь эффект из той демки

а где же exp ?

#14
18:39, 25 дек. 2015

innuendo
> а где же exp ?
в смысле? дальше там только вот это color.rgb+=g_WaterScatterColor*scatter_factor; по идее тут он должен быть нормализованным, но нет

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.