Three.js-矩形块shader

news2024/12/24 8:14:04

自定义shader代码在文末

在这里插入图片描述

在这里插入图片描述
调用方式:

new AudioMaterial({ 
	row: 10,
 	column: 5,
 	start: new Color("#00CC99"),
    end: new Color("#d3039c"),
 	brightness: "(p.y < fft && p.y > fft -0.1)"
})

就是这样
在这里插入图片描述
这样
在这里插入图片描述
默认不传递frequencybrightness
就是这样
在这里插入图片描述
使用xSymmetryx轴对称就是这样
在这里插入图片描述
使用repeat就是这样图案重复几遍
在这里插入图片描述
还有更多参数可调节可做出更多有趣的图案

封装自定义shader

/*
 * @Author: hongbin
 * @Date: 2023-08-28 18:38:15
 * @LastEditors: hongbin
 * @LastEditTime: 2023-09-11 18:55:12
 * @Description:
 */
import * as THREE from "three";

const defaultParams = {
    row: 10,
    column: 10,
    start: new THREE.Color("#fff"),
    end: new THREE.Color("#BFFF00"),
    hideBg: false,
    minOpacity: 0.1,
    maxOpacity: 1.2,
    /** 如何取音频值
     * @default p.x
     */
    frequency: "p.x",
    /** 亮度计算 */
    brightness: "(p.y < fft)",
    xSymmetry: false,
    ySymmetry: false,
    repeat: 0,
};

export const autoUpdateUniform: PropertyDecorator = (t: any, k) => {
    let r: THREE.Texture;
    Object.defineProperty(t, k, {
        get: () => r,
        set: (v) => {
            t.audioTextureUniforms.forEach(
                (uniform: Record<string, THREE.IUniform>) => {
                    uniform.iChannel0.value = v;
                }
            );
            r = v;
        },
    });
};

export class AudioMaterial extends THREE.ShaderMaterial {
    @autoUpdateUniform
    static audioTexture: THREE.DataTexture;
    static audioTextureUniforms: Array<Record<string, THREE.IUniform>> = [];

    constructor(params: Partial<typeof defaultParams>) {
        // 防止使用默认颜色的material改变uniform 导致默认颜色被更改
        const { start, end, ...filterParams } = params;

        const realParams = {
            ...defaultParams,
            ...filterParams,
            start: start || defaultParams.start.clone(),
            end: end || defaultParams.end.clone(),
        };

        const uniforms = {
            iChannel0: { value: AudioMaterial.audioTexture },
            row: { value: realParams.row },
            column: { value: realParams.column },
            start: { value: realParams.start },
            end: { value: realParams.end },
            hideBg: { value: Number(realParams.hideBg) },
            minOpacity: { value: realParams.minOpacity },
            maxOpacity: { value: realParams.maxOpacity },
        };

        AudioMaterial.audioTextureUniforms.push(uniforms);

        super({
            uniforms,
            vertexShader: ` 
            varying vec2 vUv;
            
            void main() {
                vUv = uv;
                vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0);
                gl_Position = projectionMatrix * modelViewPosition;
            }`,
            fragmentShader: `
            varying vec2 vUv;
            uniform sampler2D iChannel0;
            uniform float row;
            uniform float column;
            uniform vec3 start;
            uniform vec3 end;
            uniform float hideBg;
            uniform float minOpacity;
            uniform float maxOpacity;
          
            void main()
            {
                vec2 uv = vUv;
                if(uv.x > 1.) discard;
                ${realParams.xSymmetry ? "uv.x = abs((0.5 - vUv.x) * 2.);" : ""}
                ${
                    realParams.ySymmetry
                        ? "uv.y = 1. - abs((0.5 - vUv.y) * 2.);"
                        : ""
                }
                ${
                    realParams.repeat
                        ? `uv.x =fract(vUv.x * ${realParams.repeat}.0);`
                        : ""
                };

                float bands = row;
                float segs = column;
                vec2 p = vec2(floor(uv.x*bands)/bands,floor(uv.y*segs)/segs);

                float fft  = texture( iChannel0, vec2(${
                    realParams.frequency
                },0.0) ).x;

                vec3 color = mix(start, end, sqrt(uv.y));
                float mask = ${realParams.brightness} ? maxOpacity : minOpacity;

                vec2 d = fract((uv - p) * vec2(bands, segs)) - 0.5;
                float led = smoothstep(0.5, 0.3, abs(d.x)) *
                            smoothstep(0.5, 0.3, abs(d.y));
                vec3 ledColor = led * color * mask;

                gl_FragColor = vec4(ledColor, mask);
            }
            `,
            transparent: realParams.hideBg,
        });
    }
}

audioTexture音频纹理 请见three.js shadertoy使用手册 - 使用音频Channel和图片Channel/将音频传入glsl shader

float led = smoothstep(0.5, 0.3, abs(d.x)) *
            smoothstep(0.5, 0.3, abs(d.y));

控制方块边缘模糊程度smoothstep(0.5, 0.5, abs(d.x))就是锐利 smoothstep(0.5, 0., abs(d.x))就是圆形

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

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

相关文章

Neo4j安装教程及版本匹配

Neo4j简介 Neo4j是基于java的图形数据库&#xff08;即环境中需预先安装jdk&#xff0c;jdk8是免费的&#xff0c;但是jdk11及更高的版本是收费的&#xff09;&#xff1b;开源&#xff1b;NoSQL(非关系型数据库) windows环境中neo4j与jdk版本的对应关系 neo4j版本jdk版本3.58…

AUTOSAR-UDS诊断

目录 一.AutoSAR 诊断功能概述 二.UDS 服务分类 诊断报文格式 &#xff08;1&#xff09;带有子服务的请求报文 &#xff08;2&#xff09;不带子服务的请求报文 &#xff08;3&#xff09;含有子服务正响应报文 &#xff08;4&#xff09;不含子服务正响应报文 &#…

无涯教程-JavaScript - PMT函数

描述 PMT功能基于固定的还款额和固定的利率来计算贷款的还款额。 语法 PMT (rate, nper, pv, [fv], [type])争论 Argument描述Required/OptionalRateThe interest rate for the loan.RequiredNperThe total number of payments for the loan.RequiredPv 现在的价值,或一系列…

1462. 课程表 IV

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;Floyd传递闭包方法二&#xff1a;拓扑排序 思考写在最后 Tag 【拓扑排序】【传递闭包】【并查集】【数组】 题目来源 1462. 课程表 IV 题目解读 给你一个表示课程先决条件的数组 prerequisites&#xff0c;prerequis…

LeetCode:88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

【深度学习】实验09 使用Keras完成线性回归

文章目录 使用Keras完成线性回归1. 导入Keras库2. 创建数据集3. 划分数据集4. 构造神经网络模型5. 训练模型6. 测试模型7. 分析模型 附&#xff1a;系列文章 使用Keras完成线性回归 Keras是一款基于Python的深度学习框架&#xff0c;以Tensorflow、Theano和CNTK作为后端&#…

AlwaysOn-关于读写分离的误区(一)

前言 很多人认为AlwaysOn在同步提交模式下数据是实时同步的&#xff0c;也就是说在主副本写入数据后可以在辅助副本立即查询到。因此期望实现一个彻底的读写分离策略&#xff0c;即所有的写语句在主副本上&#xff0c;所有的只读语句分离到辅助副本上。这是一个认知误区&#x…

多要素气象站:推动气象监测进入智能化新时代

一、多要素气象站概述 多要素气象站是一种集成了多种气象监测要素的自动化气象站&#xff0c;可实现对温度、湿度、风速、风向、气压、太阳辐射等多项气象参数的实时监测。相较于传统气象站&#xff0c;多要素气象站体积更小、能耗更低&#xff0c;且具备更高的测量精度和更广…

高精度加法[大整数运算]

这里只有大整数运算,浮点数相对来说很少使用到 前言 如果使用C内置的类型来存储大整数(位数有几万位),是会溢出的,得不到正确的值,即使是long long int类型的范围也只是[-9*10^19,9*10^19](无符号是[0,10^20]),所能存储的最大数字也就20位,所以需要高精度算法,高精度加法具体…

人脸签到系统 pyQT+数据库+深度学习

一、简介 人脸签到系统是一种基于人脸识别技术的自动签到和认证系统。它利用计算机视觉和深度学习算法来检测、识别和验证个体的面部特征&#xff0c;以确定其身份并记录其出现的时间。这个系统通常用于各种场景&#xff0c;包括企业、学校、会议、活动和公共交通等&#xff0c…

海格里斯HEGERLS托盘式四向穿梭车系统核心技术有哪些?

四向穿梭车立体仓库是常见的自动化立体库解决方案&#xff0c;可以应用在不规则、异型、长宽比较大或者少品种大批量、多品种大批量的仓库。其核心设备四向穿梭车克服了环形穿梭车的缺点&#xff0c;具有很高的灵活性和柔性。对于大型的立体库系统&#xff0c;四向穿梭车具有很…

2023最新计算机大数据毕业设计选题推荐100例

文章目录 0 前言1 如何选题1.1 选题技巧&#xff1a;如何避坑(重中之重)1.2 为什么这么说呢&#xff1f;1.3 难度把控1.4 题目名称1.5 最后 2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类…

人工智能基础-趋势-架构

在过去的几周里&#xff0c;我花了一些时间来了解生成式人工智能基础设施的前景。在这篇文章中&#xff0c;我的目标是清晰概述关键组成部分、新兴趋势&#xff0c;并重点介绍推动创新的早期行业参与者。我将解释基础模型、计算、框架、计算、编排和矢量数据库、微调、标签、合…

HTTPS原理(证书验证+数据传输)

HTTPS协议相关的概念有SSL、非对称加密、CA证书等 为什么用了HTTPS就是安全的&#xff1f;HTTPS底层原理如何实现&#xff1f;用了HTTPS就一定安全吗&#xff1f; HTTPS实现原理 HTTPS在内容传输上的加密使用的是对称加密&#xff0c;证书验证阶段使用非对称加密 中间人攻…

无涯教程-JavaScript - INTRATE函数

描述 INTRATE函数返回完全投资证券的利率。 语法 INTRATE (settlement, maturity, investment, redemption, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证券的到期…

innovus:如何设置clock cell list(icg logic_cells buffer inverter)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 set_ccopt_property inverter_cells [list CKINV*LVT] set_ccopt_property buffer_cells [list CKBUF*LVT] set_ccopt_property clock_gating_cells [list CLKNQ*LVT set_cc…

数据结构与算法(一)数组的相关概念和底层java实现

一、前言 从今天开始&#xff0c;笔者也开始从0学习数据结构和算法&#xff0c;但是因为这次学习比较捉急&#xff0c;所以记录的内容并不会过于详细&#xff0c;会从基础和底层代码实现以及力扣相关题目去写相关的文章&#xff0c;对于详细的概念并不会过多讲解 二、数组基础…

数字化互联网数字孪生:重塑未来的创新思维

数字孪生是当今数字化互联网时代的一个引人注目的概念&#xff0c;它正在改变着各个行业的方式和节奏。数字孪生不仅是一种技术&#xff0c;更是一种思维方式。 数字化互联网的崛起 数字化互联网正在以前所未有的速度和规模改变着我们的生活和工作方式。从智能手机到物联网设备…

按图搜索淘宝商品(拍立淘)API接口 搜爆款商品 图片搜索功能api 调用示例

接口名称&#xff1a;item_search_img 公共参数 请求地址: 测试item_search_img 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_s…

品牌为什么要做价格管控

价格管控的目的其实是为了治理低价&#xff0c;低价的存在会使渠道变得不可控&#xff0c;比如经销商低价跟价&#xff0c;消费者因为低价而转投其他品牌&#xff0c;这些无形中都会影响品牌的销量&#xff0c;阻碍品牌发展&#xff0c;所以做价格管控&#xff0c;就是在做好低…