【Webgl_glslThreejs】搬运分享shader_飘落心形

2024-04-24 23:36

本文主要是介绍【Webgl_glslThreejs】搬运分享shader_飘落心形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源网站

https://www.shadertoy.com/view/4sccWr

效果预览

在这里插入图片描述

代码演示

将shadertory上的代码转成了threejs可以直接用的代码,引入文件的material,并在创建mesh或已有物体上使用material即可,使用时请注意uv对齐。

import { DoubleSide, ShaderChunk, ShaderMaterial } from "three";
//source: https://www.shadertoy.com/view/4sccWr
// Into You - by Martijn Steinrucken aka BigWings - 2018
// Email:countfrolic@gmail.com Twitter:@The_ArtOfCode
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.// You can change the focal plane by moving the mouse up and down.// A video of the effect can be found here:
// https://www.youtube.com/watch?v=lrMiME82Cuk// Making of video part1:
// https://www.youtube.com/watch?v=dXyPOLf2MbU// Android Phone Wallpaper:
// https://play.google.com/store/apps/details?id=com.TheArtOfCode.FallingHearts// Music - Novo Amor - Anchor
// https://soundcloud.com/mrsuicidesheep/novo-amor-anchorconst vertex = `
${ShaderChunk.logdepthbuf_pars_vertex}
bool isPerspectiveMatrix(mat4) {return true;
}varying vec4 m_pos;
varying vec2 vUv;void main () {vUv = uv;// 从贴图中采样颜色值vec3 newPosition = normal*vec3(0,0,0)+position;gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);${ShaderChunk.logdepthbuf_vertex}
}`;// 片元着色器代码
const fragment = /*glsl*/`
${ShaderChunk.logdepthbuf_pars_fragment}
precision mediump float;
varying vec2 vUv;
uniform float uTime;
uniform float uSpeed;#define S(a, b, t) smoothstep(a, b, t)
#define sat(x) clamp(x, 0., 1.)
#define HEARTCOL vec3(1., .01, .01)
#define NUM_HEARTS 50.
#define LIGHT_DIR vec3(.577, -.577, -.577)// Polynomial smooth max from IQ
float smax( float a, float b, float k ) {float h = sat( .5 + .5*(b-a)/k );return mix( a, b, h ) + k*h*(1.-h);
}
// Quaternion rotation functions from Ollj
vec4 qmulq(vec4 q1, vec4 q2){return vec4(q1.xyz*q2.w+q2.xyz*q1.w+cross(q1.xyz,q2.xyz),(q1.w*q2.w)-dot(q1.xyz,q2.xyz));}
vec4 aa2q(vec3 axis, float angle){return vec4(normalize(axis)*sin(angle*0.5),cos(angle*0.5));}
vec4 qinv(vec4 q){return vec4(-q.xyz,q.w)/dot(q,q);}
vec3 qmulv(vec4 q, vec3 p){return qmulq(q,qmulq(vec4(p,.0),qinv(q))).xyz;}vec2 RaySphere(vec3 rd, vec3 p) {float l = dot(rd, p);float det = l*l - dot(p, p) + 1.;if (det < 0.) return vec2(-1);float sd = sqrt(det);return vec2(l - sd, l+sd);
}struct sphereInfo {vec3 p1, p2, n1, n2;vec2 uv1, uv2;
};sphereInfo GetSphereUvs(vec3 rd, vec2 i, vec2 rot, vec3 s) {sphereInfo res;rot *= 6.2831;vec4 q = aa2q(vec3(cos(rot.x),sin(rot.x),0), rot.y);vec3 o = qmulv(q, -s)+s;vec3 d = qmulv(q, rd);res.p1 = rd*i.x;vec3 p = o+d*i.x-s;res.uv1 = vec2(atan(p.x, p.z), p.y);res.n1 = res.p1-s;res.p2 = rd*i.y;p = o+d*i.y-s;res.uv2 = vec2(atan(p.x, p.z), p.y);res.n2 = s-res.p2;return res;
}float Heart(vec2 uv, float b) {uv.x*=.5;float shape = smax(sqrt(abs(uv.x)), b, .3*b)*.5;uv.y -= shape*(1.-b);return S(b, -b, length(uv)-.5);
}vec4 HeartBall(vec3 rd, vec3 p, vec2 rot, float t, float blur) {vec2 d = RaySphere(rd, p);vec4 col = vec4(0);if(d.x>0.) {sphereInfo info = GetSphereUvs(rd, d, rot, p);float sd = length(cross(p, rd));float edge =  S(1., mix(1., 0.1, blur), sd);float backMask = Heart(info.uv2, blur)*edge; float frontMask = Heart(info.uv1, blur)*edge; float frontLight = sat(dot(LIGHT_DIR, info.n1)*.8+.2);float backLight = sat(dot(LIGHT_DIR, info.n2)*.8+.2)*.9;col = mix(vec4(backLight*HEARTCOL, backMask), vec4(frontLight*HEARTCOL, frontMask), frontMask);}return col;
}void main() {vec2 uv = vUv;uv-=.5;vec2 m =vec2(.5);float t = uTime*.3*uSpeed;vec3 rd = normalize(vec3(uv, 1));// m.y = iMouse.z>0. ? 1.-m.y : .4;vec2 rot = t*vec2(.12, .18);vec4 col = vec4(0);for(float i=0.; i<1.; i+=(1./NUM_HEARTS)) {float x = (fract(cos(i*536.3)*7464.4)-.5)*15.;float y = (fract(-t*.2+i*7.64)-.5)*15.;float z = mix(14., 2., i);float blur = mix(.03, .35, S(.0, .4, abs(m.y-i)));rot += (fract(sin(i*vec2(536.3, 23.4))*vec2(764.4, 987.3))-.5);vec4 heart = HeartBall(rd, vec3(x, y, z), rot, t, blur);col = mix(col, heart, heart.a);}gl_FragColor = vec4(col);${ShaderChunk.logdepthbuf_fragment}
}`;const uniforms = {uTime: { value: 1.0 },
};
const CircleGridShaderMaterial = new ShaderMaterial({uniforms: {uTime: { value: 1.0 },uSpeed: { value: 1.0, max: 20, min: 0.1 }},vertexShader: vertex,fragmentShader: fragment,side: DoubleSide,transparent: true,
});const loop = () => {requestAnimationFrame(loop)CircleGridShaderMaterial.uniforms.uTime.value += .001
}
loop()
setInterval(() => {// CircleGridShaderMaterial.uniforms.uTime.value += .0001
}, 5000);
export default CircleGridShaderMaterial

页面展示

flowHeart

这篇关于【Webgl_glslThreejs】搬运分享shader_飘落心形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933144

相关文章

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表