three.js太阳火焰shader

2024-03-23 21:50
文章标签 js shader 火焰 太阳 three

本文主要是介绍three.js太阳火焰shader,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述

着色器代码
顶点

varying vec2 vUv;
varying vec3 pos;void main() {pos = position;vUv = uv;vec3 myPosition = position;// myPosition *= sin(position.y / 3.);// myPosition.x *= sin((uv.y) * 3.124);vec4 viewPosition = modelViewMatrix * vec4(myPosition, 1.0);gl_Position = projectionMatrix * viewPosition;
}

片元着色器 重点

varying vec2 vUv;
uniform float iTime;
uniform vec2 iResolution;precision highp float;float random(in vec2 p) {vec3 p3 = fract(vec3(p.xyx) * .1031);p3 += dot(p3, p3.yzx + 33.33);return fract((p3.x + p3.y) * p3.z);
}float noise(in vec2 _st) {vec2 i = floor(_st);vec2 f = fract(_st);// Four corners in 2D of a tilefloat a = random(i);float b = random(i + vec2(1.0, 0.0));float c = random(i + vec2(0.0, 1.0));float d = random(i + vec2(1.0, 1.0));vec2 u = f * f * (3. - 2.0 * f);return mix(a, b, u.x) +(c - a) * u.y * (1. - u.x) +(d - b) * u.x * u.y;
}float light(in vec2 pos, in float size, in float radius, in float inner_fade, in float outer_fade) {float len = length(pos / size);return pow(clamp((1.0 - pow(clamp(len - radius, 0.0, 1.0), 1.0 / inner_fade)), 0.0, 1.0), 1.0 / outer_fade);
}float flare(in float angle, in float alpha, in float time) {float t = time;float n = noise(vec2(t + 0.5 + abs(angle) + pow(alpha, 0.6), t - abs(angle) + pow(alpha + 0.1, 0.6)) * 7.0);//	n = 1.0;float split = (15.0 + sin(t * 2.0 + n * 4.0 + angle * 20.0 + alpha * 1.0 * n) * (.3 + .5 + alpha * .6 * n));float rotate = sin(angle * 20.0 + sin(angle * 15.0 + alpha * 4.0 + t * 30.0 + n * 5.0 + alpha * 4.0)) * (.5 + alpha * 1.5);float g = pow((2.0 + sin(split + n * 1.5 * alpha + rotate) * 1.4) * n * 4.0, n * (1.5 - 0.8 * alpha));g *= alpha * alpha * alpha * .5;g += alpha * .7 + g * g * g;return g;
}#define SIZE 2.8
#define RADIUS 0.07
#define INNER_FADE .8
#define OUTER_FADE 0.02
#define SPEED .1
#define BORDER 0.21void main() {// vec2 uv = (fragCoord.xy - iResolution.xy * 0.5)/iResolution.y;vec2 uv = vUv - 0.5;float f = .0;float f2 = .0;float t = iTime * SPEED;float alpha = light(uv, SIZE, RADIUS, INNER_FADE, OUTER_FADE);float angle = atan(uv.x, uv.y);float n = noise(vec2(uv.x * 20. + iTime, uv.y * 20. + iTime));float l = length(uv);if(l < BORDER) {t *= .8;alpha = (1. - pow(((BORDER - l) / BORDER), 0.22) * 0.7);alpha = clamp(alpha - light(uv, 0.2, 0.0, 1.3, .7) * .55, .0, 1.);f = flare(angle * 1.0, alpha, -t * .5 + alpha);f2 = flare(angle * 1.0, alpha * 1.2, ((-t + alpha * .5 + 0.38134)));} else if(alpha < 0.001) {f = alpha;} else {f = flare(angle, alpha, t) * 1.3;}gl_FragColor = vec4(vec3(f * (1.0 + sin(angle - t * 4.) * .3) + f2 * f2 * f2, f * alpha + f2 * f2 * 2.0, f * alpha * 0.5 + f2 * (1.0 + sin(angle + t * 4.) * .3)), 1.0);if(length(uv) > 0.3 && gl_FragColor.r < 0.3) {// gl_FragColor.a = 0.;gl_FragColor.a = gl_FragColor.r;if(gl_FragColor.r < 0.2) {gl_FragColor.a = gl_FragColor.r * gl_FragColor.r;}}
}

threejs 代码

/** @Author: hongbin* @Date: 2022-11-16 19:35:37* @LastEditors: hongbin* @LastEditTime: 2022-11-17 10:42:55* @Description: 太阳粒子*/
import * as THREE from "three";
import { SUNMaterial } from "../shader/SunPoints/Sun";export const SunPoints = () => {return new THREE.Mesh(new THREE.PlaneGeometry(10, 10, 5, 5), SUNMaterial);
};
import * as THREE from "three";
import fragmentShader from "./fs.glsl";
import vertexShader from "./vt.glsl";const uniforms = {iTime: { value: 1 },iResolution: { value: new THREE.Vector2(300, 300) },iMouse: { value: new THREE.Vector3(0, 0, 0) },
};export const SUNMaterial = new THREE.ShaderMaterial({uniforms,vertexShader,fragmentShader,transparent: true,
});

这篇关于three.js太阳火焰shader的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

js react 笔记 2

起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块const { randomUUID } = require('crypto');const uuid = randomUUID();console.log(uuid); // 输出类似 '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* @param uuid* @returns {boolean}*/export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid === "string" && uuid !== NIL) { //uuid

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(