ThreeJs-11精通着色器编程(重难点)

news/2025/1/7 11:10:02/文章来源:https://www.cnblogs.com/heymar/p/18643840

着色器语言编程比较重要,后面的几个章节都会围绕这个来做特效

一.初识着色器语言

首先什么叫做着色器,他是一种语言,首先需要设置为着色器材质,然后在材质里面书写一些语言,可以告诉他顶点,然后去自定义一些东西,比如我想要这一面为红色等等

image-20241225223903619

比如用一个基础材质做了一个平面

image-20241225223947852

image-20241225223935800

现在改为着色器材质

着色器里面一个顶点着色器告诉顶点位置,gl只能支持四维向量,vec4表示四维向量,position是有material自带的position直接拿过来的,最后一个1是第四个顶点

下面一个事片源着色器,负责告诉这个顶点要干嘛,比如我要修改颜色,也是一个四维向量rgba并且是浮点数,这个颜色就表示红色

image-20241225224452718

image-20241225224819496

此时呢颜色就出来了,但是并不会跟着坐标轴转换

image-20241225224839921

此时需要将顶点位置进行转换,这个公式也是固定的

image-20241225225018167

image-20241225225036810

此时就能随便动了

image-20241225225054818

1.1 插件安装与文件导入开发

当然这个语言有时候可能会写很多,在一个模板字符串里面就比较麻烦,没有任何代码提示,而且也不会报错

所以一般我们都会这么来

image-20241225230556176

image-20241225230607593

这边导入并使用

image-20241225230743065

这里解决了些东西弄了半天,反正vite不支持直接这样分包导入

如果一定要这样需要下载并配置

image-20241225233419320

image-20241225233429249

可以安装的插件,第一个对glsl语言的支持不再是字符串,第二个是格式化并代码提示的

QQ_1735180948347

1.2 原始着色器材质(RawShaderMaterial)

原始着色器和之前的着色器材质用法基本类似,唯一的区别就是,着色器材质很多都是可以默认直接拿mesh里面的比如position,但是原始着色器材质,所有的矩阵的属性都需要声明

image-20241226134211431

QQ_1735191745820

到这里就可以实现之前着色器一样的效果,初次之外还有一些别的设置

还有一个属性uv,他表示的是顶点,二维属性那就是二维平面的顶点

QQ_1735192410314

image-20241226140049591

QQ_1735193116068

QQ_1735193132990

1.3 控制顶点类型改变波浪形状

到目前为止好像也没有看出这个材质特殊性在哪

我们可以把之前顶点着色器代表位置的参数领出来作为一个变量,可以去单独设置他的x轴z轴等

需要注意的是:这里的position每个轴的范围是-1到1,参考之前的uv顶点,也就是x轴是越来越大的,所以如果你用z轴去加x轴,就会变成这个效果,细品

QQ_1735195001880

QQ_1735195015282

这里提供一个sin函数

GIF 2024-12-26 14-46-48

当然这是横着的波浪如果要竖着那就是对应还是z轴加y轴

image-20241226145323166

image-20241226145335831

然后还可以来一个例子可以根据不同的凸出起来的高度设置暗度不同的颜色,所以首先我要拿到z轴

顶点这边声明可以交换的属性并且把z轴给上去

image-20241226150436920

顶点拿过来的值不支持修改,如果要改,那就拿过来在片段着色器里面改,声明一个变量需要声明是什么类型的值,这里只是为了让范围在0-1

一定要注意分号每一行都要加分号

image-20241226152249705

image-20241226152326834

1.4 uniform传递变量

我们可以让这个波浪动起来,既然要动起来就可以让z轴加一些动态的数据,其实就是时间就可以了

首先我们材质这里是可以传值进来的

image-20241226153319996

然后在动画函数里面,之前拿到过时间的函数,这个函数就是从进入3D一直以来的秒数

QQ_1735198778424

QQ_1735198828492

GIF 2024-12-26 15-40-51

1.5 uv纹理

如果有一张图,比如冬奥会的旗帜是否可以让他实现彩旗飘飘的效果,这里需要用到uv纹理贴图

大概步骤是,加载贴图,然后跟刚才一样通过变量传进来

QQ_1735200983415

这边接收注意有专门的类型,根据顶点去除对应的颜色,刚好是四个点,图片也是四个点

QQ_1735201429309

GIF 2024-12-26 16-24-08

二.着色器编写各类型图案

2.1 上部分

首先回到最开始的状态,用uv作为四个顶点的颜色的状态

image-20241226215305833

对于之前uv的应用

image-20241226215543190

利用uv实现渐变效果

image-20241226220355777

image-20241226220402770

mod取余函数

GIF

step函数

实现斑马效果,注意上面mod的结果0-1之间

当然如果是对vUv.x那就是垂直条纹

image-20241226221559868

image-20241226221617113

条纹还可以相加,x轴弄完弄y轴

image-20241226221913449

image-20241226221922462

当然加减乘除其实都是可以的,分别可以完成不同的图案

乘的话就是类似于一个正方形

只有1的位置才是白色,因为值设置的很大0.8,所以1的很少

image-20241226223542851

image-20241226223620628

如果设置的很小大多数都可以为1

image-20241226223835056

image-20241226223843140

相减

image-20241226223719237

如果相乘,值有些偏差此时可以形成一个条状效果

image-20241226223942543

image-20241226223957783

那我如果来两个条带相加呢

image-20241226224024252

image-20241226224033551

T型图,也就是设置偏移量,乘了10之后,减一些值

image-20241226224404855

image-20241226224421073

利用绝对值 abs函数

首先这里可以理解下

此时表示0-0.5,为什么以为vUv的值是0-1,减去0.5后,那就是-0.5-0.5,但是颜色rgba不支持负数,所以x轴就只能从0-0.5开始变,小于0的部分就都是黑色

image-20241226224710347

image-20241226224845318

那如果我想实现一个从白到黑再到白的效果,那就要用到绝对值

image-20241226224923369

image-20241226224936658

2.2 下部分

min函数

实现十字交叉效果

image-20241226225208839

image-20241226225222850

同理把min改为max

image-20241226225251105

利用step函数

外围是1,里面是0

想反过来前面加个1.0-即可

image-20241226225435481

image-20241226225417500

floor函数向下取整

同方法可以用向上取整ceil就是现在的图案白的更多一点

也可以实现之前的条纹渐变

x*10范围在0-9.9999向下取整后那就是0-9再除以10那就是0-1左右

image-20241226225814496

image-20241226225931417

既然说floor可以实现渐变,之前也说乘可以实现格子效果,那么

QQ_1735265346083

QQ_1735265368197

随机值

glsl本身没有随机函数,这里推荐一个网站

https://thebookofshaders.com/

类似于glsl的文档,里面有一些关于随机怎么生成的使用,直接拿过来

QQ_1735265999923

QQ_1735266077787

QQ_1735266086429

同理改造下,让每个网格随机

QQ_1735266186919

QQ_1735266304481

length函数

通过length函数得到uv变量长度给到color可以实现一个半径的扩展渐变效果

image-20241228125345301

image-20241228125358635

distance函数,两个向量之间的距离

比如上面那个图案我不想以圆弧向外扩进,想以中心远点扩展,那我就可以计算顶点到0.5 0.5的距离,0.5 0.5就是中心原点

要反过来颜色,就1-

image-20241228130720259

image-20241228130728307

除法

前面加减乘都是有了对应的效果,由刚才的效果可知,越中间,和原点的距离是越短的值肯定就越小,那么一个值除以小值结果反而越大,除以大值结果反而越小,所以除法之后,中间越大,就越亮接近白色

image-20241228135225333

image-20241228135237936

那如果此时减去一个1.0,周围可能会使负数,之前也看过负数也是黑色,然后光圈周围会越来越胆,最后只剩下比1大的还保留颜色

image-20241228135426185

image-20241228135437038

设置uVu

我们可以对uVu进行直接设置,乘就是拉伸

image-20241228135712551

image-20241228135721140

加减就是偏移

image-20241228135756624

image-20241228135804383

套用十字交叉效果

image-20241228135959173

image-20241228140009333

当然也可以直接相加

image-20241228140029918

image-20241228140041867

如果你想要这个图案旋转起来

也是一样的需要去找一些能实现的函数

image-20241228140409393

三个参数一个是uv,一个是旋转角度,一个是中心原点位置

旋转角度,也没有pi可以使用这里就用3.14代替,*0.25就表示180度,向量如果都是0.5可以只写一个

image-20241228140627878

image-20241228140634115

如果要动起来传一个时间属性就可以了

image-20241228140658811

GIF

三.shader着色器编写高级图案

3.1 上部分

实现圆形

顶点到原点的距离扩散,但是同时给个限定要么黑要么白

image-20241228142825202

image-20241228142832500

如果你想让黑色再小点,也就是偏移往回走

image-20241228142916330

image-20241228142921522

实现圆环效果,也就是里面再来个圆,一个偏移量大一个小,然后乘起来

image-20241228143301333

image-20241228143318595

当然实现光圈的效果不止这一种比如还有

image-20241228145551435

实现波浪环效果

就是把顶点的x和y进行改造,加上sin角度,放入刚才环形里面

image-20241228150308837

image-20241228150314489

image-20241228150332109

image-20241228150337452

实现雷达效果

需要用到一个 atan反正切函数

先简单设置一个角度

image-20241228151442258

然后就可以得到这么一个图案,从左下顶点开始沿着一个顺时针,颜色变淡

image-20241228153020331

调整一下从中心原点开始,不从左下角开始

image-20241228153523283

image-20241228153530157

但是现在角度有点问题,左边部分是小于1减去0.5还是负数所以是黑色,这里有个公式

image-20241228154800692

image-20241228154806994

然后用刚才实现圆环的效果,给到透明度

image-20241228154859489

image-20241228154907112

或者也可以用刚才实现圆的效果

image-20241228154939964

image-20241228154950874

image-20241228155008519

实现动态效果,就用刚才的旋转加时间方法拿来给到uv

image-20241228155155327

GIF

万花筒效果

角度不变但是使用角度乘以一个数(决定到时候万花筒有多少壁),再对6.28取余,6.28就是2π,就是一圈

image-20241228155924306

image-20241228160045041

或者也可以先把角度除了6.28

image-20241228160129215

image-20241228160136266

当然也可以在最上面定义好一个π,注意定义的方式

image-20241228160213840

3.2 下部分

分享一个网站https://www.shadertoy.com/,国内外大佬分享着色器成果的地方

噪声效果

可以在文档里面看到,一种随机效果,可以实现云,沙滩等效果

image-20241228160636320

image-20241228160651117

实现波纹效果

文档直接复制其函数

image-20241228163336472

直接用上来还不行还需要配合分段函数来

image-20241228163712126

image-20241228163717891

sin实现波纹效果

本身直接加sin是很模糊的

image-20241228165849092

image-20241228165855212

image-20241228165914593

image-20241228165920279

现在想实现一个效果除了这些颜色在混合一点颜色进来,还有一个函数叫做混合mix

黑加黄,第三个参数就是第三种颜色,就是黑

image-20241228170140830

image-20241228170144742

image-20241228170343901

image-20241228170356423

融入波纹给到比例即可

image-20241228170502466

image-20241228170506535

剩下漫天孔明灯效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.12.30 由于不会制表痛失一份工作,学习excel制表

单元格格式可以用来切换其中内容的格式,小技巧,数值右对齐,文字左对齐 单元格内换行输出使用Alt + Enter 在>数据->分列中可以将某个单元格中的数据分成不同的列 1.随机函数 rand()返回一个0-1之间的数字,且图表每次更新都会进行随机 randbetween(low,high)返回一…

关于 IntelliJ IDEA 2024 安装激活使用教程以及常见问题(激活至2026,实际上永久,亲测!)

申明:本教程 IntelliJ IDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 IDEA 首先,如果小伙伴的电脑上有安装老版本的 IDEA , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即…

Docker入门之docker-compose

一,Docker-compose简介 1,Docker-compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件…

『AotuHotKey』——一个小巧却高效的实用效率工具

[!note] 本来主要是想找一下「」和『』,然后这个方法直接可以找到大部分的特殊字符通过输入法输出『Ctr + shift + Z』进入搜狗输入法的『符号大全』在『标点符号』项可以找到「」和『』使用AutoHotKey自定义替换[!note] 每次想要用到这两个符号的时候都要进入输入法的『符号大…

让项目数据一目了然的10款项目管理软件推荐

在当今快节奏的商业环境中,项目管理已经成为企业成功的关键因素之一。无论是小型团队还是大型企业,高效的项目管理工具都能帮助团队更好地规划、执行和监控项目进度。然而,面对市场上琳琅满目的项目管理软件,如何选择一款适合自己团队的工具,往往让人感到困惑。本文将为您…

锁整理--有缺失

// 概述 // 分类// ------------------------------------------------------------------------------------------- // 全局锁 // 对整个数据库加锁,整个实例变为只读状态,后续的dml语句,ddl语句,已经更新操作的事务提交语句都会阻塞 // 应用场景主要是做全库的逻辑备份,…

项目管理证书与敏捷方法论的结合应用

项目管理证书与敏捷方法论的结合应用是当前项目管理领域中一个备受关注的话题。随着项目复杂性和不确定性的增加,传统的项目管理方法在应对快速变化的需求时显得力不从心。敏捷方法论以其灵活性和适应性,逐渐成为项目管理的主流方法之一。然而,项目管理证书如PMP(项目管理专…

六大亮点解析:AI视频监控助力部队训练安全管理

一、用户痛点: 在部队的日常训练和任务执行中,官兵的安全始终是最为重要的保障。然而,传统的监控方式存在显著的局限性,尤其是在高强度、长时间的训练过程中,人工值守监控容易产生疲劳,误判的风险大,难以及时发现隐患。尤其在突发事件发生时,传统监控往往无法做到即时预…

低代码时代:这 9 款项目管理系统,90% 的企业都在用!

在低代码时代,企业对项目管理系统的需求日益增长。项目管理工具种类繁多,涵盖了从传统的项目管理软件到新兴的云平台,其中包括禅道、简道云、明道云、Trello、Teambition、Jira、Redmine、OutSystems、Zoho Projects等。这些工具以其独特的功能和特点,满足了不同企业的项目…

在Lazarus下的Free Pascal编程教程——在程序运行时改变组件的外观

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“…

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(00):iced简单窗口的实现以及在窗口显示中文

本文是系列博客园的第一篇,主要介绍一下基于rust的GUI库iced的简单使用前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍…

飞书lark机器人 自动化发版

开发飞书机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署飞书lark机器人 自动化发版 #1 介绍开发飞书机器人接收消息并调用构建接口, 实现自动化发版发送指令 -> 机器人接收指令 -> 调用jenkins-job…