Three.js-着色器
Shader操控的是物体的
表面。
似乎可以将Shader理解为
装饰器模式。
Shader能干嘛?
Shader中文翻译是着色器,从这个名字就可以看出来,其功能是着色。
作者:毛伟
链接:https://www.zhihu.com/question/471183747/answer/2009491115
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大部分shader本质上就是进行了两个环节的计算:
- 顶点着色 vertex shading
- 像素(片元)着色 pixel/fragment shading
顶点着色:
首先通过建模软件制作出网格(mesh)模型,这个模型中的每一个顶点就会在顶点着色阶段进行计算,这个时候可以修改每个顶点的坐标,就能实现风吹草动、海水波浪、全息图像信号抖动之类的效果,也可以做近似计算给整体上色,但是效果会很糙,这时就需要计算更精细(开销也更大)的像素着色。
像素(片元)着色:
在每个顶点之间连线形成的三角面(也有四边形或其他类型的面)上,会进行光栅化(rasterization),也就是把三角形放到像素格子(栅栏)里,判断具体哪一个像素包含在里面,然后对其进行上色,这一步的操作就精细化到了每一个像素的级别,可以实现的功能也更多(大部分shader逻辑都是在这个环节实现的),这一步,我们可以决定每一个像素的颜色、透明度,颜色实际上也不只是色彩,通过各种前辈研究出来的模型,我们其实在上色的时候就决定了物体的明暗光影、质感(金属、塑料),还能通过一些逻辑实现各种炫彩特效、黑白剪影……
计算
computeShader
渲染
一句话经验
Shader必须依赖于BufferGeometry
通过BufferAttribute定义自定义属性
注意,WebGL 1.0使用的shader只支持GLSL 1.0.17, 这是因为WebGL是基于OpenGL ES 2.0的,是给相对于台式机性能较低的手持设备用的。 所以如果在网上找到的GLSL的例子,在WebGL上可能不管用,要注意版本。 GLSL 1.0与现行最高的4版本比起区别还是比较多的,比如老版本里叫attribute, varying的变量到高版本里叫in, out了。
VSCode的Shader环境搭建
资料
羡澈的Shader入门文章:
http://zhangwenli.com/blog/2017/03/05/cartoon-shading-1/
视频教程:
https://www.youtube.com/playlist?list=PLFky-gauhF452rW98W4cyZ8_2fXBjfGOT
GLSL的API文档:
https://www.khronos.org/registry/OpenGL-Refpages/gl4/
【精】常用Shader函数(这是个好思路,函数封装,降低开发成本;另外这个人写了很多教程和文章,很值得一看):
https://iquilezles.org/articles/
2分钟讲解Shader:
https://www.youtube.com/watch?v=bC4xJzbKNd0
基本概念:
https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-shaders-and-glsl.html
课程:
(精)Web3D汽车展厅教程:
https://juejin.cn/post/6981249521258856456
烟雾融合效果:
https://zhuanlan.zhihu.com/p/151851272
大家都推荐的冯乐乐的教程:
https://www.zhihu.com/pub/reader/119585555
https://github.com/candycat1992/Unity_Shaders_Book
这个人做智慧城市的,用了不少着色器做特效:
https://www.zhihu.com/people/ni-ruo-cheng-feng-618/posts?page=1
另外他对Cesium玩得很溜:
https://hpugis.blog.csdn.net/?type=blog
案例
可以从https://www.shadertoy.com/ 上面找,有很多优秀的案例。
Shadertoy教程:
https://www.zhihu.com/people/liu-zhong-bin-51/posts
https://www.shadertoy.com/view/Xtf3Rn
游动的鱼,很真实,太厉害了:
https://www.shadertoy.com/view/ldj3Dm
马里奥:
https://www.shadertoy.com/view/Msj3zD
光线追踪反射效果:
https://www.shadertoy.com/view/fsGcW3
Raymarching:
https://www.shadertoy.com/view/Xds3zN
云雾:
https://www.shadertoy.com/view/XslGRr
Three.js作者写的Shader:
siri(这两个结合起来做,尚鲁南):
https://www.shadertoy.com/view/llySRm
https://www.shadertoy.com/view/WsKXRc
洋流:
https://www.shadertoy.com/view/MdGBWG
工具
Shader Graph
类似UE里面的着色器编辑器一样,这个是Web的:
https://discourse.threejs.org/t/visual-shader-editor-wip/11129
这个工具很好啊,这种节点编辑器感觉大有可为,我们做软件设计也可以用,类似思维导图,但是比思维导图更强,因为可以融合逻辑。这属于LowCode?
这个也是: