three.js shader 实现天空中白云

embedded/2024/10/21 10:20:19/

three.js shader 实现天空中白云

预览: https://threehub.cn/#/codeMirror?navigation=ThreeJS&classify=shader&id=whiteCloud

更多案例 可见 预览: https://threehub.cn
在这里插入图片描述

import * as THREE from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";const { innerWidth, innerHeight } = window;
const aspect = innerWidth / innerHeight;class Base {constructor () {this.init();this.main();}main() {this.deltaTime = {value: 0}var fragmentSrc = ["precision mediump float;","uniform vec2 iResolution;","uniform float iGlobalTime;","uniform vec2 iMouse;","float hash( float n ) {","return fract(sin(n)*43758.5453);","}","float noise( in vec3 x ) {","vec3 p = floor(x);","vec3 f = fract(x);","f = f*f*(3.0-2.0*f);","float n = p.x + p.y*57.0 + 113.0*p.z;","return mix(mix(mix( hash(n+  0.0), hash(n+  1.0),f.x),","mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y),","mix(mix( hash(n+113.0), hash(n+114.0),f.x),","mix( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);","}","vec4 map( in vec3 p ) {","float d = 0.2 - p.y;","vec3 q = p - vec3(1.0,0.1,0.0)*iGlobalTime;","float f;","f  = 0.5000*noise( q ); q = q*2.02;","f += 0.2500*noise( q ); q = q*2.03;","f += 0.1250*noise( q ); q = q*2.01;","f += 0.0625*noise( q );","d += 3.0 * f;","d = clamp( d, 0.0, 1.0 );","vec4 res = vec4( d );","res.xyz = mix( 1.15*vec3(1.0,0.95,0.8), vec3(0.7,0.7,0.7), res.x );","return res;","}","vec3 sundir = vec3(-1.0,0.0,0.0);","vec4 raymarch( in vec3 ro, in vec3 rd ) {","vec4 sum = vec4(0, 0, 0, 0);","float t = 0.0;","for(int i=0; i<64; i++) {","if( sum.a > 0.99 ) continue;","vec3 pos = ro + t*rd;","vec4 col = map( pos );","#if 1","float dif =  clamp((col.w - map(pos+0.3*sundir).w)/0.6, 0.0, 1.0 );","vec3 lin = vec3(0.65,0.68,0.7)*1.35 + 0.45*vec3(0.7, 0.5, 0.3)*dif;","col.xyz *= lin;","#endif","col.a *= 0.35;","col.rgb *= col.a;","sum = sum + col*(1.0 - sum.a);	","#if 0","t += 0.1;","#else","t += max(0.1,0.025*t);","#endif","}","sum.xyz /= (0.001+sum.w);","return clamp( sum, 0.0, 1.0 );","}","void main(void) {","vec2 q = gl_FragCoord.xy / iResolution.xy;","vec2 p = -1.0 + 2.0*q;","p.x *= iResolution.x/ iResolution.y;","vec2 mo = -1.0 + 2.0*iMouse.xy / iResolution.xy;",// camera"vec3 ro = 4.0*normalize(vec3(cos(2.75-3.0*mo.x), 0.7+(mo.y+1.0), sin(2.75-3.0*mo.x)));","vec3 ta = vec3(0.0, 1.0, 0.0);","vec3 ww = normalize( ta - ro);","vec3 uu = normalize(cross( vec3(0.0,1.0,0.0), ww ));","vec3 vv = normalize(cross(ww,uu));","vec3 rd = normalize( p.x*uu + p.y*vv + 1.5*ww );","vec4 res = raymarch( ro, rd );","float sun = clamp( dot(sundir,rd), 0.0, 1.0 );","vec3 col = vec3(0.6,0.71,0.75) - rd.y*0.2*vec3(1.0,0.5,1.0) + 0.15*0.5;","col += 0.2*vec3(1.0,.6,0.1)*pow( sun, 8.0 );","col *= 0.95;","col = mix( col, res.xyz, res.w );","col += 0.1*vec3(1.0,0.4,0.2)*pow( sun, 3.0 );","gl_FragColor = vec4( col, 1.0 );","}"];const geometry = new THREE.SphereGeometry(5000, 50);const material = new THREE.ShaderMaterial({transparent: true,side: THREE.BackSide,uniforms: {iGlobalTime: this.deltaTime,iResolution: {value: {x: window.innerWidth,y: window.innerHeight},},iMouse: {value: {x: 0,y: 0}}},vertexShader: `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);}`,fragmentShader: fragmentSrc.join("\n"),});const mesh = new THREE.Mesh(geometry, material);this.scene.add(mesh);const scope = thisfunction animate() {scope.controls.update();scope.renderer.render(scope.scene, scope.camera);scope.deltaTime.value = scope.clock.getElapsedTime()requestAnimationFrame(animate);}animate()}init() {this.clock = new THREE.Clock();this.loader = new GLTFLoader();this.renderer = new THREE.WebGLRenderer({antialias: true,logarithmicDepthBuffer: true,});this.renderer.setPixelRatio(window.devicePixelRatio);this.renderer.setSize(innerWidth, innerHeight);document.body.appendChild(this.renderer.domElement);this.camera = new THREE.PerspectiveCamera(60, aspect, 0.01, 10000);this.camera.position.set(5, 5, 5);this.scene = new THREE.Scene();this.controls = new OrbitControls(this.camera, this.renderer.domElement);const light = new THREE.AmbientLight(0xffffff, 0.5);this.scene.add(light);}}
new Base();

http://www.ppmy.cn/embedded/114290.html

相关文章

速通汇编(六)认识栈,SS、SP寄存器,push和pop指令的作用

一&#xff0c;栈 &#xff08;一&#xff09;栈的特点 栈是一种具有特殊访问方式的存储空间&#xff0c;特殊在于&#xff0c;进出这块存储空间的数据&#xff0c;“先进后出&#xff0c;后进先出” 由于栈的这个“先进后出”的特点&#xff0c;我们可以利用其来很好的操作内…

Qt联系方式界面设计

1 "显示用户的联系方式”设计 (1) 添加该工程的提供主要显示用户的联系方式界面的函数所在的文件&#xff0c;在"Example" 项目名上单击鼠标右键&#xff0c;在弹出的快捷菜单中选择“添加新文件…”选项&#xff0c;在弹出的对话框中选择 "C Class"…

全面解析性能测试中的瓶颈分析与优化策略!

在软件开发的生命周期中&#xff0c;性能测试是确保应用程序在不同负载下稳定运行的关键步骤。性能瓶颈是导致系统性能下降的主要原因&#xff0c;及时发现并解决这些瓶颈&#xff0c;能够显著提升系统的响应速度和用户体验。本文将深入探讨性能测试中的瓶颈分析方法与优化策略…

Android架构组件:MVVM模式的实战应用与数据绑定技巧

Android架构组件&#xff08;Android Architecture Components&#xff09;是Google推出的一组帮助开发者设计灵活、可维护应用的库。这些组件旨在解决生命周期管理、数据持久化、UI绑定等问题&#xff0c;促进应用的模块化开发。开发人员可以使用这些组件更容易地实现MVVM、MV…

机器视觉5 检测原理之视觉定位

在机器视觉检测中有一个非常重要的流程就是定位&#xff0c;检测区准确的检测效果的基础是精确的定位。以下是关于OpenCV中matchTemplate检测的详细说明&#xff0c;包括其原理、使用方法和应用场景。 1. matchTemplate 的原理 模板匹配的基本原理是通过滑动模板图像与源图像…

GoFly快速开发框架/Go语言封装的图像相似性比较插件使用说明

说明 图像相似性搜索应用广泛、除了使用搜索引擎搜索类似图片外&#xff0c;像淘宝可以让顾客直接拍照搜索类似的商品信息、应用在商品购物上&#xff0c;也可以应用物体识别比如拍图识花等领域。还有在调研图片鉴权的方案&#xff0c;通过一张图片和图片库中的图片进行比对&a…

Adobe出现This unlicensed Photoshop app has been disabled

Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发&#xff0c;则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…

Live800:从心出发,以情动人:构建深度客户服务文化

在当今这个竞争激烈的市场环境中&#xff0c;企业之间的较量已不仅仅局限于产品质量的比拼&#xff0c;更在于谁能提供更优质、更贴心的客户服务。在这个背景下&#xff0c;“从心出发&#xff0c;以情动人”成为了构建深度客户服务文化的核心理念&#xff0c;它要求企业不仅要…