作者meowyih (meowyih)
看板GameDesign
标题[程式] 超新手 shader language 教学文 (一)
时间Mon Sep 27 13:32:25 2021
前二天在这篇文章
文章代码(AID):
#1XJQL9jP (GameDesign)
才知道有
https://www.shadertoy.com/ 这个方便测试 WebGL 的网站,
就称趁机写了三篇非常入门的 shader language 教学,
帮想从零开始学 shader language (GLSL)
的网友省点时间
UV 座标
讲 shader 一定要先提的是 UV 座标。
UV其实就是一个长方形的XY轴座标,
差别是UV的座标值是在 [0,1] 之间,
所以UV(0.5,0.5)就是平面的正中央。
举例,
一个画布长宽 (600,400),
某个点 a1 位置 (300, 100),
其 uv 是
(300/600, 100/400) = (0.5, 0.25)。
UV这名字的由来,
就只是因为这二个字母是在三维的(X,Y,Z)前,
没别的意义。
UV 的原点,
在 WebGL 是在左下角,
在 Godot 是在左上角,
并不一定。
颜色
shader用 RGB 加上一个透明度的四个值代表颜色。
四个值都在[0,1]之间,
大於1都算1,小於0就是0。
白色就是(1,1,1,1),黑色就是(0,0,0,1)。
因为UV座标和颜色的值都是[0,1]之间,
所以马上可以写一个简单的程式测试圆点在哪。
使用 ShaderToy 网站
开启
https://www.shadertoy.com/ ,
点右上的 New,
在右边编辑框内打入下面程式,
按下面 compile 的三角形执行按钮。
code
https://i.imgur.com/VrybqHX.jpg
img
https://i.imgur.com/LeBQYwD.png
说明
每次要画一个 pixel,
都会呼叫一次 mainImage()。
vec4 fragColor 是 pixel 的颜色,
fragCoord 是 pixel 座标 (非UV)。
iResolution 是 ShaderToy 内建的参数,
代表了画面的长宽最大值。
Godot 要怎麽写?
在 Godot 中要写 shader,
最快的方法是建立一个 ColorRect Node,
填入 Rect 的长宽 (size),
颜色 (color)。
再到右边 Inspector 的
CanvasItem -> Materil ->
ShaderMaterial -> New Shader
就可以在 Shader Editor 里开始写了。
在 Godot 中,同样的 function 是这样写的。
code
https://i.imgur.com/Kw0d526.jpg
UV 是 global variable 不用计算,
COLOR 也是类似的 variable。
因为都算是 GLSL,
长的都差不多。
比较 ShaderToy 和 Godot 的执行画面,
ShaderToy 的黑色区域在左下角,
Godot 在左上角,
代表二者的原点位置不同。
椭圆弧形变正圆弧形
因为画面不是正方形,
而是长方形,
所以看的出来画出的渐层并非正圆弧,
而是椭圆形弧形的。
要解决 uv 的二个值最大都是 1,
代表的真实长度却不同的问题,
我们可以重新计算 x 或 y 值。
一般来说 resolution.y 比较短 (横向画面),
所以当作 1,照比例调整 uv.x。
code
https://i.imgur.com/QlLz5yE.jpg
image
https://i.imgur.com/3jhrLbm.png
在 Godot 里,
语法也差不多。
差别是多了个可以从外部更改的 resolution 的 uniform 变数,
取得作画范围的像素长宽值。
code
https://i.imgur.com/UyGE880.jpg
转换了 uv.x 後,
画出来的阴影就是个圆弧形,
而非椭圆弧形的了。
将原点改成画面中心处
如果我们想把原点放在中央,
而非左上或左下,
只要加一行座标转换就可以了。
code
https://i.imgur.com/opVlKK9.jpg
这样圆心就在中间了。
image
https://i.imgur.com/XntdZ4F.png
Godot version
https://i.imgur.com/NNApsmn.jpg
下一篇,
要将这个渐层的圆形,
变成单色的圆形。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.228.97.156 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1632720747.A.76E.html
※ 编辑: meowyih (61.228.97.156 台湾), 09/27/2021 14:48:06
1F:推 wangm4a1: 推 入门文章不多 因为本来就是进阶 09/27 16:10
2F:推 dklassic: 推新手文,也推 shadertoy XD 09/27 16:31
3F:→ dklassic: 我还以为写 shader 都知道这东西,看来没我想像的广播 09/27 16:31
4F:推 devon5: 感谢分享 09/27 17:32
5F:推 wel0789321: 赞 推个 09/27 19:20
6F:推 coolrobin: 感谢推一个 09/27 20:34
7F:推 LuMya: 推 学无止境 09/27 23:17
8F:推 louisalflame: 推分享 09/28 08:19
9F:推 CarpeDiemAL: 推 感谢! 09/28 15:53
10F:推 OSDim: 我今天才知道UV是怎麽来的 太神辣 09/28 23:26
11F:推 johnny94: 推 09/29 10:06
12F:推 leonardo0917: 推推 09/29 12:28
13F:推 Bencrie: OpenGL 的 texture coordinates 叫 strq,不是 uvw 啊 09/30 01:40
14F:推 grezod: 推 09/30 21:17
15F:推 johnkry: 我看很深奥啊... 10/01 08:49
16F:推 megah321: 推 10/08 18:53
17F:推 WanderLudens: push 10/09 12:07