three.js shader 实现天空中白云

news2024/9/21 0:40:49

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 = this
        function 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.coloradmin.cn/o/2150609.html

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

相关文章

web基础—dvwa靶场(十二)JavaScript Attacks

JavaScript Attacks (前端攻击) 本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作&#xff0c;攻击可以通过分析网络流量来实现&#xff0c;但这不是本章节的重点而且可能要困难得多。 只需提交单词 “success” 即可攻击成功&#xff0c;显然…

开石开放式耳机怎么样?南卡、开石、声阔开放式耳机测评

​作为一名多年的数码博主&#xff0c;我本人也是个耳机发烧友&#xff0c;我最近注意到数码圈特别是蓝牙耳机圈中&#xff0c;有一种耳机特别火&#xff0c;叫开放式耳机&#xff0c;这类耳机的佩戴舒适度是非常高的&#xff0c;这也激起了我对这类耳机的兴趣&#xff0c;因此…

感知笔记4:YOLO 3D 物体定位

如何在 ROS 中使用 YOLO 如何在 2D 中检测人和大象如何在 3D 中检测人和大象 有许多可用的深度学习库。您可能听说过&#xff1a;Keras、TensorFlow 和 Darknet。 在这里我们将使用 Darknet&#xff0c;因为它实现了 YOLOv3&#xff0c;这是一个对象检测模型。它非常快&…

jdk版本更换以及遇到的问题略谈(以jdk1.8和jdk11为例)

目录 在我看来 遇到的问题 原因以及解决方法 方法一&#xff1a;禁止误改误删 方法二&#xff1a;bat文件驱动运行 方法三&#xff1a;cmd命令 方法四&#xff1a;修改注册表&#xff08;不推荐&#xff09; 最近在进行漏洞复现&#xff08;shiro550&#xff09;的时候&…

无人机如何突破高海拔高寒飞行环境?

无人机在突破高海拔高寒飞行环境方面&#xff0c;需要解决一系列技术难题和挑战。以下是一些主要的技术手段和策略&#xff1a; 1. 无人机平台设计与优化 增强机体结构&#xff1a;采用轻质高强度的材料&#xff0c;如碳纤维、复合材料等&#xff0c;减轻机身重量&#xff0c…

决策树算法中篇

手动计算实现决策树分类 数据整合 X[真实用户] y X 计算未划分信息熵 s X[真实用户] p s.value_counts()/s.size (p * np.log2(1/p)).sum() 按照日志密度进行划分 x X[日志密度].unique() x.sort() # 如何划分呢&#xff0c;分成两部分 for i in range(len(x) - 1):sp…

【目标检测论文必备】通俗易懂地讲解用绿色、蓝色、红色框可视化描述YOLO模型权重对于单个图片的训练效果(TP、FP、FN)

可视化步骤 一、生成自定义权重对图片的预测类别坐标信息二、创建需要预测的文件夹三、可视化运行 一、生成自定义权重对图片的预测类别坐标信息 新建脚本文件/path/to/your/ultralytics/savetxt.py放入对应参数运行会得到一个个独立的/path/to/your/runs/detect/output/outpu…

移动技术开发:简单计算器界面

1 实验名称 简单计算器界面 2实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【数据结构取经之路】图解红黑树

目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 左右旋动图 红黑树的插入分析 红黑树的插入代码 红黑树与AVL-tree比较 红黑树的应用场景 前言 AVL-tree之外&#xff0c;另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree)&#xff0c;这名字听起来…

码头童话,“丈量”行业数智化转型

作者 | 曾响铃 文 | 响铃说 一箱车厘子从地球正对的另一边远渡重洋来到中国&#xff0c;而一旦到达&#xff0c;5个小时内它就能变成北京、天津、河北、河南等区域老百姓果盘里的美味。 这一幕&#xff0c;来自央视联合华为制作发布的《新智中国说-谈智一会间》第一期“码头…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件&#xff1f;php怎么给邮箱发邮件&#xff1f; PHP作为一种广泛使用的服务器端脚本语言&#xff0c;提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件&#xff0c;帮助开发者轻松实现这一重要功能。 PHP…

30道常见的软件测试面试题(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明确&#xff0c;需求不会频繁变动 2&#xff09;项…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…

【Python报错已解决】ModuleNotFoundError: No module named ‘tensorflow‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

浅谈“流量回放”

一、流量回放定义 “流量回放”通常指的是将之前记录的网络请求和响应数据重新发送到系统中&#xff0c;以模拟真实用户的操作。这种技术主要用于测试和调试目的&#xff0c;帮助开发人员和测试人员更好地理解系统在特定条件下的行为。 二、流量回放的技术原理&#xff1a; 数…

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…