[程式] 超新手 shader language 教学文 (五)

楼主: meowyih (meowyih)   2022-06-15 23:06:23
连我都料想不到,隔了快一年,
居然出第五篇了?!
上一篇 (四) 讲的是 noise 的基础,
这一篇 (五) 打算讲
a. 如何画 noise outline (外框?),
b. noise outline 有什么常见应用。
[准备]
经过了前一篇,
应该都能画得出下面类似的 2d noise
https://imgur.com/JncbutC
不管是用 Game Engine 给的现成 noise,
或是抄来的 shader 写出来的都行,
反正画得出来就好。
如果画不出来,这里有个现成的 (不是我写的)
https://www.shadertoy.com/view/Wt2czD
[noise outline]
假设产生 noise 的 code 长得像这样:
float noise( vec2 uv )
{
// create noise from uv
}
void fragment( out vec4 COLOR, vec2 UV )
{
vec2 uv = UV; // uv 应该要随着萤幕长宽更改比例
// 产生一个黑白的 noise 画面
float n = noise(uv);
COLOR.rgb = vec3(n);
}
原始画面是
https://imgur.com/JncbutC
现在加一行,把 code 改成:
float n = noise(uv);
// =========== magic formula =========== //
n = 0.3 * 0.09 / (0.3-n);
// ===================================== //
COLOR.rgb = vec3(n);
画面就会变成
https://imgur.com/B9HfACw
将将将! 划出外框了! 就这么简单 XD
把 0.3 / 0.09 / 0.3 这三个参数改一改,
会出现其他各种效果,
有空可以试试。
[应用]
所以画了 outline 又能怎样呢?
其实有不少实用的地方。
举例来说,第一个‘水滴效果’
https://imgur.com/FcBbHxw
这是把萤幕当镜头,
模拟镜头上有水珠的样子。
因为水珠的外圈折射率大,中心折射率小,
跟外框的颜色
作者: wangm4a1 (水兵)   2022-06-16 10:45:00
作者: Lhmstu (lhmstu)   2022-06-16 15:35:00
推推
作者: dklassic (DK)   2022-06-16 15:54:00
酷,我以为你闪电是要用噪声推轨迹模拟,原来参数正确就可以显示成那样
作者: eugenelinrmx   2022-06-17 21:39:00

Links booklink

Contact Us: admin [ a t ] ucptt.com