3.js - 使用着色器实现各种图形

news2024/11/26 10:32:49

有更多案例,私我

main.js

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import * as dat from 'dat.gui'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'

// @ts-ignore
import basicVertexShader from './shader/11-02/deep/vertexShader.glsl?raw'
// @ts-ignore
import basicFragmentShader from './shader/11-02/deep/fragmentShader.glsl?raw'

const scene = new THREE.Scene()
// scene.background = new THREE.Color('#ffffff')

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.aspect = window.innerWidth / window.innerHeight
camera.position.set(0, 0, 10)

const axesHelper = new THREE.AxesHelper(2)
scene.add(axesHelper)

// --------------------------------------------------------------------

const textureLoader = new THREE.TextureLoader()
let texture = textureLoader.load('../public/assets/texture/ca.jpeg')

// 创建着色器材质
const shaderMaterial = new THREE.ShaderMaterial({
	vertexShader: basicVertexShader,
	fragmentShader: basicFragmentShader,
	uniforms: {
		// 动画时间
		uTime: {
			value: 0
		},
		uTexture: {
			value: texture
		}
	},
	side: THREE.DoubleSide,
	transparent: true
})

const floor = new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 64, 64), shaderMaterial)
scene.add(floor)

// --------------------------------------------------------------------

const renderer = new THREE.WebGLRenderer({ alpha: true })
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true

const clock = new THREE.Clock()
const render = () => {
	let time = clock.getElapsedTime()
	shaderMaterial.uniforms.uTime.value = time
	
	// controls.update()
	requestAnimationFrame(render)
	renderer.render(scene, camera)
}
render()

window.addEventListener('resize', () => {
	// 重置相机的宽高比
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新相机的投影矩阵
	camera.updateProjectionMatrix()
	// 重置渲染器的宽高比
	renderer.setSize(window.innerWidth, window.innerHeight)
	// 更新渲染器的像素比
	renderer.setPixelRatio(window.devicePixelRatio)
})

vertexShader.glsl

precision lowp float;

varying vec2 vUv;

void main() {
	vUv = uv;
	
	vec4 modelPosition = modelMatrix*vec4(position, 1.0);
	gl_Position = projectionMatrix*viewMatrix*modelPosition;
}

precision highp float;

varying vec2 vUv;

void main() {
	1、通过顶点对应的uv,决定每一个像素在uv图像的位置,通过这个位置x,y决定颜色
	// gl_FragColor = vec4(vUv, 0, 5);
	
	2、第1的变形
	// gl_FragColor = vec4(vUv, 1, 1);
	
	3、利用uv,实现,渐变效果,左 ->// float strengh = vUv.x;
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	4、利用uv,实现,渐变效果,下 ->// float strengh = vUv.y;
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	5、利用uv,实现,渐变效果,上 ->// float strengh = 1.0 - vUv.y;
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	6、利用uv,实现,段范围内渐变(这里是,由,黑->白,的渐变)
	// float strengh = vUv.y * 5.0;
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	7、利用取模,实现,反复效果
	// float strengh = mod(vUv.y * 5.0, 1.0); `就是把y,分成5份`
	float strengh = mod(vUv.x * 10.0, 1.0); `就是把x,分成10份`
	gl_FragColor = vec4(strengh, strengh, strengh, 1);

	8、利用,step(edge, x),如果 x < edge,返回0.0,否则返回1.0
	// float strengh = mod(vUv.y * 10.0, 1.0);
	// strengh = step(0.5, strengh);
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	9、利用,step(edge, x),如果 x < edge,返回0.0,否则返回1.0
	// float strengh = mod(vUv.y * 10.0, 1.0);
	// strengh = step(0.8, strengh);
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	10、利用,step(edge, x),如果 x < edge,返回0.0,否则返回1.0
	// float strengh = mod(vUv.x * 10.0, 1.0);
	// strengh = step(0.8, strengh);
	// gl_FragColor = vec4(strengh, strengh, strengh, 1);
	
	11、条纹相加
	// float strength = step(0.8, mod(vUv.x*10.0, 1.0));
	// strength += step(0.8, mod(vUv.y*10.0, 1.0));
	// gl_FragColor = vec4(strength, strength, strength, 1);
	
	12、条纹相乘
	// float strength = step(0.8, mod(vUv.x*10.0, 1.0));
	// strength *= step(0.8, mod(vUv.y*10.0, 1.0));
	// gl_FragColor = vec4(strength, strength, strength, 1);
	
	13、条纹相减
	float strength = step(0.8, mod(vUv.x*10.0, 1.0));
	strength -= step(0.8, mod(vUv.y*10.0, 1.0));
	gl_FragColor = vec4(strength, strength, strength, 1);
}


效果图-1

在这里插入图片描述

效果图-2

在这里插入图片描述

效果图-3

在这里插入图片描述

效果图-4

在这里插入图片描述

效果图-5

在这里插入图片描述

效果图-6

在这里插入图片描述

效果图-7-1

在这里插入图片描述

效果图-7-2

在这里插入图片描述

效果图-8

在这里插入图片描述

效果图-9

在这里插入图片描述

效果图-10

在这里插入图片描述

效果图-11

在这里插入图片描述

效果图-12

在这里插入图片描述

效果图-13

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061064.html

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

相关文章

一篇初学者入门Python匿名函数与Lambda表达式详细教程

首先要了解了如何定义和使用函数的参数,以及如何从一个函数返回值.这篇文章将深入介绍Python中的“匿名函数”和“Lambda表达式”,这两个概念在实际编程中非常有用 如果你对Python感兴趣的话&#xff0c;可以试试我整理的这一份全套的Python学习资料&#xff0c;【点击这里】免…

数据库表转为库表设计文档

开发完之后&#xff0c;就一大堆文档需要写的&#xff0c;其中就有库表设计文档&#xff0c;所以直接写个接口&#xff0c;直接把库表转为库表设计文档就行&#xff0c;省一大堆时间摸鱼了。直接贴代码。 pom文件引入依赖 <!--引入数据库表结构文档生成器Screw依赖--> &…

《驾驭未来:大型语言模型的理论与实践》—— 探索大模型的奥秘

在这个信息爆炸的时代&#xff0c;人工智能尤其是大型语言模型&#xff08;LLM&#xff09;已经成为推动科技进步的关键力量。无论是科学研究、商业应用还是日常生活&#xff0c;大型语言模型都在不断地改变着我们的世界。对于那些渴望深入了解这一前沿技术的人来说&#xff0c…

JAVA实现单词词频统计-辅助英文考试学习

一、基于GUI的可以自行输入的英文单词词频统计软件

SpingBoot集成kafka发送读取消息

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本&#xff08;重要&#xff09;2、创建springboot项目&#xff0c;引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

小程序学习day10-自定义组件的data数据、方法、属性,data与properties的关系、自定子组件之数据监听器

39、WXS脚本&#xff08;小程序独有的一套脚本语言&#xff09;&#xff08;续&#xff09; &#xff08;6&#xff09;自定义组件的data数据、方法、属性 1&#xff09;自定义组件的data数据&#xff08;在小程序组件中&#xff0c;用于组件模版渲染的私有数据&#xff09; …

定格精彩瞬间!详解六自由度技术原理及应用

在体育赛事中&#xff0c;观赏各项目的精彩瞬间&#xff0c;欣赏运动员的卓越表现是观众们最为关注的焦点。以体操跳马为例&#xff0c;运动员们全力助跑&#xff0c;然后奋力起跳、腾空&#xff0c;接着精准的推手和转体动作&#xff0c;最后稳稳落地&#xff0c;整个动作行云…

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步

多线程API 进程和线程 进程&#xff1a;进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人&#xff0c;专门负责完成某项任务&#xff08;比如打开浏览器、播放音乐&#xff09;。每个进程都有自己独立的资源&#xff08;比如内存&#xff09;和…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

墙裂推荐!云上机密计算,阿里云上体验了一下海光内存加密和远程认证

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 机密计算目录 前言1、构…

哈希原理实现

本节主要看源代码实现 哈希特点 哈希&#xff08;Hashing&#xff09;是一种将数据映射到固定大小的表中以实现快速查找的数据结构和算法方法。哈希的主要特点包括&#xff1a; 1. 高效的查找、插入和删除 时间复杂度&#xff1a;哈希表通常提供近乎常数时间的查找、插入和…

app安全评估报告的常见留存措施(内附独家资料)

对用户账号、操作时间、操作类型、网络源地址和目标地址、网络源端口、客户端硬件特征等日志信息以及用户发布信息记录的留存措施 1**. 用户账号信息**&#xff1a;我们将用户账号信息安全存储&#xff0c;只有授权的人员能够访问。这些信息包括用户名、电子邮件地址等&#xf…

【C++ 面试 - 面向对象】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

VAuditDemo审计之二次注入漏洞

目录 VAuditDemo二次注入漏洞 搜索危险函数&#xff0c;用户可控点 regCheck.php messageSub.php message.php 漏洞调用链 漏洞错误利用过程 注册用户 xxxx, 发表payload留言 漏洞正确利用过程 注册用户 wwww\ 退出用户 wwww\\ 使用 wwww\ 登录 发表留言 替换dat…

《javaEE篇》--定时器

定时器概念 当我们不需要某个线程立刻执行&#xff0c;而是在指定时间点或指定时间段之后执行&#xff0c;假如我们要定期清理数据库里的一些信息时&#xff0c;如果每次都手动清理的话就太麻烦&#xff0c;所以就可以使用定时器。定时器就可以比作一个闹钟&#xff0c;可以让…

C++ 设计模式(6. 适配器模式)

适配器模式Adapter Pattern是一种结构型设计模式&#xff0c;它可以将一个类的接口转换成客户希望的另一个接口&#xff0c;主要目的是充当两个不同接口之间的桥梁&#xff0c;使得原本接口不兼容的类能够一起工作。基本结构 Target 是目标接口&#xff0c;Adaptee 是需要适配的…

微信小程序实例代码解读

以微信 小程序开发工具给的示例代码为例&#xff1a; 主页代码&#xff1a; index.wxml 这个文件是一个微信小程序页面的 WXML 结构,主要功能是展示一个快速开始教程的步骤和内容。 源代码&#xff1a; <!--index.wxml--> <view class"container">&l…

ZK-Rollups测评

1. 引言 Matter Labs团队和多个高校研究人员一起&#xff0c;发布2024年论文《Analyzing and Benchmarking ZK-Rollups》&#xff0c;开源代码见&#xff1a; https://github.com/StefanosChaliasos/zkrollup-benchmarking&#xff08;Python&#xff09; 其中&#xff1a; …

安装MySQL入门基础指令

一.安装MySQL(以5.7版本为例) 1.一路默认安装&#xff0c;截图供大家参考 修改自己window安装名字即可 2.配置环境变量 C:\Program Files\MySQL\MySQL Server 5.7\bin 写入系统环境变量即可在window窗口使用其服务了 3.登录MySQL服务 进入控制台输入命令 mysql -u root …

运维小技能:基于Windows系统和‌Linux系统,以tomcat为案例,讲解如何新增自启动服务。

文章目录 引言‌I Linux系统‌(以CentOS为例)基础知识:运行级别(run level)基于chkconfig 工具,设置服务启动类型。基于systemctl 新增系统服务II 基于Windows系统设置服务自启动的常规操作安装多个tomcat服务,并设置自启动。III 扩展制定定时任务优化停止Tomcat服务命令引…