three.js shader 实现天空中白云

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.xdnf.cn/news/144334.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

按摩上门预约小程序源码系统 在线评价+即时服务 带完整的安装代码包以及搭建部署教程

系统概述 按摩上门预约小程序源码系统是一款专为按摩行业量身定制的移动端应用解决方案。它利用先进的互联网技术&#xff0c;将传统按摩服务与线上平台相结合&#xff0c;实现了用户与服务商之间的无缝对接。该系统不仅简化了预约流程&#xff0c;提高了服务效率&#xff0c;…

【Python】探索 PluginBase:Python 插件系统的灵活构建

我承认这道菜有赌的成分&#xff0c;果然还是赌输了。 在现代软件开发中&#xff0c;插件系统为应用程序提供了极大的灵活性和扩展性。Python&#xff0c;作为一种流行的编程语言&#xff0c;拥有丰富的库和框架来支持插件的开发。今天&#xff0c;我们将深入探讨一个名为Plug…

23.面试题02.07链表相交

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode apheadA;ListNode bpheadB;int lenA0,lenB0;//求两个链表长度while(ap!null){apap.next;lenA;}while(bp!null){bpbp.next;lenB;}apheadA;bpheadB;int len0;//用来计算让…

BAS模型论文阅读

论文全名&#xff1a;Background Activation Suppression for Weakly Supervised Object Localization and Semantic Segmentation 论文pdf下载地址&#xff1a;2309.12943 (arxiv.org) 论文会议版全名&#xff1a;Background Activation Suppression for Weakly Supervised O…

AI产品经理面试20个问题汇总(含面试解题技巧、注意事项)

这题我会&#xff01;这是一个包含AI产品经理问题的备考文章&#xff0c;本文主要讲解AI产品经理的备考注意事项、真题展示、解题技巧及高效刷题方法&#xff0c;相信大家看完就一定能掌握技巧并且顺利通关&#xff01; 一、AI产品经理面试问题展示(20道) 1. 请描述一下你过…

Parallels Desktop 20(Mac虚拟机) v20.0.0 for Mac 最新破解版(支持M系列)

Parallels Desktop 20 for Mac 正式发布&#xff0c;完全支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;并且在企业版中引入了全新的管理门户。 据介绍&#xff0c;新版本针对 Windows、macOS 和 Linux 虚拟机进行了大量更新&#xff0c;最大的亮点是全新推出的 Parallels…

[Leetcode] 227.基本计算器

标题&#xff1a;[Leetcode] 227.基本计算器 个人主页&#xff1a;水墨不写bug &#xff08;图片来源于网络&#xff09; // _ooOoo_ // // o8888888o // // …

PCIe扫盲(五)

系列文章目录 PCIe扫盲&#xff08;一&#xff09; PCIe扫盲&#xff08;二&#xff09; PCIe扫盲&#xff08;三&#xff09; PCIe扫盲&#xff08;四&#xff09; PCIe扫盲&#xff08;五&#xff09; 文章目录 系列文章目录TLP Header详解&#xff08;一&#xff09;Byte En…

Linux系统编程入门 | 模拟实现 ls -l 命令

模拟实现代码 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <pwd.h> #include <grp.h> #include <time.h> #include <string.h>int main(int argc, char* argv[]) {if (a…

为什么嫁人就要嫁公务员?稳定、收入高、福利好、资源多

在现代社会&#xff0c;择偶不仅仅是感情问题&#xff0c;更涉及到经济、社会地位和未来生活的方方面面。 对于很多女性来说&#xff0c;选择一个稳定、可靠的伴侣至关重要。而公务员作为一个备受尊敬的职业&#xff0c;成为了很多人心目中的理想对象。 那么&#xff0c;为什…

使用密钥文件登陆Linux服务器

假设A服务器为登陆目标,已经运行ssh服务。 B服务器作为登陆发起端。 登陆A服务器,账户S。 运行命令: ssh-keygen -t rsa 此时账户S家目录下会自动创建目录“.ssh”,目录下会有id_rsa和id_rsa.pub两个文件。 id_rsa为私钥,id_rsa.pub为公钥。 id_rsa文件内容下载到B服务…

web基础—dvwa靶场(七)SQL Injection

SQL Injection&#xff08;SQL注入&#xff09; SQL Injection&#xff08;SQL注入&#xff09;&#xff0c;是指攻击者通过注入恶意的SQL命令&#xff0c;破坏SQL查询语句的结构&#xff0c;从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的&#xff0c;常常会导致…

勒索软件和四重勒索策略:使用易备数据备份软件进行保护

文章内容&#xff1a; 1. 勒索行为类型 2. 勒索软件的演变&#xff1a;四重勒索 3. 遭遇勒索软件攻击时应遵循的准则 4. 防御勒索攻击的工具 5. 使用易备数据备份软件进行预防和备份 2024 年&#xff0c;勒索软件仍然是全球网络安全面临的最大威胁之一。威胁形势不断演变&#…

win11 下载安装MYSQL 5.7.30(保姆教程)

目录 一、下载安装包 二、安装 三、试一下 四、解决问题 1.如果出现“mysql不是内部或外部命令&#xff0c;也不是可运行的程序” 1.配置环境变量 2.重新打开cmd测试 一、下载安装包 进入下载链接&#xff1a;https://www.mysql.com/why-mysql/windows/https://www.mysq…

00898 互联网软件应用与开发自考复习题

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 第一章 一、选择题 通过Internet发送请求消息和响应消息使用&#xff08;&#xff09;网络协议。 FTP B. TCP/IP C. HTTP D. DNS Web应…

OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理

发布不到一周&#xff0c;OpenAI 的最新模型 o1 的“护城河”似乎已经失守。 近日&#xff0c;有人发现谷歌 DeepMind 早在今年 8 月发表的一篇论文&#xff0c;揭示了与 o1 模型极其相似的工作原理。 这项研究指出&#xff0c;在模型推理过程中增加测试时的计算量&#xff0c…

SAP SPROXY 配置

事务码SPROXY 然后找到目标的地址 然后创建新对象即可

基于springboot的在线视频点播系统

文未可获取一份本项目的java源码和数据库参考。 国外研究现状&#xff1a; 与传统媒体不同的是&#xff0c;新媒体在理念和应用上都采用了新颖的媒介或媒体。新媒体是指应用在数字技术、在传统媒体基础上改造、或者更新换代而来的媒介或媒体。新兴媒体与传统媒体在理念和应用…

大数据产业核心环节有哪些?哪里可以找到完整的大数据产业分析?

▶大数据产业前景开阔 大数据产业正站在数字化时代前沿&#xff0c;预计在未来几年将实现显著增长和扩展。目前&#xff0c;中国大数据产业规模在2021年已达到1.3万亿元&#xff0c;并在2022年增长至1.6万亿元&#xff0c;预计到2025年将突破3万亿元大关&#xff0c;年均复合增…

客户文章 | DAP-seq助力揭示MYC2转录因子调控银杏萜内酯生物合成的分子机制

银杏萜内酯是银杏中重要的天然药用活性成分&#xff0c;具有抗血栓、抗炎、治疗心脑血管疾病和预防阿尔茨海默病等药理活性&#xff0c;也是血小板活化因子的强拮抗剂。萜内酯在银杏中的含量极低&#xff0c;难以满足医药行业的需求&#xff0c;限制了银杏产业的发展和临床应用…