THREE.JS 数据纹理简明教程

news2024/11/29 0:41:33

我一直在研究从 Three.js 中的数据创建纹理。 这非常简单,但有一些注意事项,有些部分可能会令人困惑。 很多年前我曾陷入过一些陷阱,最近又再次陷入其中,所以我决定写下来!

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、什么让(我)感到困惑?

从数据创建新纹理时,你必须设置格式、类型,并以特定类型的 TypedArray 提供数据:

const texture = new DataTexture(data, width, height, format, type, ...);

文档里说:

“类型”必须与“格式”相对应。

好的...那么我如何知道为我想要使用的格式设置哪种类型?

2、灰度纹理

在这篇文章中,我将只讨论 WebGL1 的灰度(单通道)纹理,因为它是我当前的重点。 本文其余部分的所有内容都将适用于你想要支持的任何内容。

2.1 哪种格式?

好吧,我想创建一个单通道(灰度)纹理。

在文档的内部格式部分,你可以根据通道数和每个像素的字节数找到最适合你的格式。

亮度非常适合灰度纹理。 需要注意的是,它仅支持 Webgl1 的 UnsignedByte 纹理类型。

如果你使用 WebGL2, R* 格式允许你支持各种不同的位深度。

要了解有关不同文件格式含义的更多信息,我发现此页面很有用,它解释了文件格式后缀 F、 _SNORM 的含义以及如何解释这些类型的纹理。 这对于数据标准化很重要。

2.2 亮度格式允许三种类型(WebGL1)

好吧,我们刚刚了解到,对于 WebGL1,亮度格式采用 UnsignedByte 类型。

我们可以做得更好吗?

如果你的浏览器支持 OES_texture_float 扩展,则一堆新类型( Float 和  HalfFloat)可用于 LUMINANCE 格式。 (官方文档)

FormatTypeByte per Pixel
RGBAFLOAT16
RGBFLOAT12
LUMINANCE_ALPHAFLOAT8
LUMINANCEFLOAT4
ALPHAFLOAT4
RGBAHALF_FLOAT_OES8
RGBHALF_FLOAT_OES6
LUMINANCE_ALPHAHALF_FLOAT_OES4
LUMINANCEHALF_FLOAT_OES2
ALPHAHALF_FLOAT_OES2

2.3 Type转TypedArray

这非常简单:

TypeByte per PixelTyped Array
UnsignedByte1Uint8Array
HalfFloat2Uint16Array
Float4Float32Array

重要的是类型数组中的位数与表中每个像素的字节数相匹配。 此外,对于 HalfFloat,应适当准备数据。

2.4 访问片段着色器中的数据

所有整数纹理(包括 UnsignedByteType)在上传到着色器时都会自动标准化,而浮动/整数纹理(包括 Float 和 HalfFloat)则按原样传递。

根据格式名称,您可以知道您正在处理哪种类型的数据以及是否会为您进行标准化。 (参考)。

换句话说,在片段着色器中,当使用 UnsignedByteType 纹理时,从纹理 2D 获取的值会自动标准化为 0 到 1 之间。 对于 FloatType 和 HalfFloatType,你将获得类型化数组中的值,而无需任何标准化。

3、示例

  • UnsignedByte Texture
const textureSize = 16
const dataSize = 10;
const data = new Uint8Array(dataSize);

for (let i = 0; i < dataSize) {
  data[i] = Math.round(Math.random() * 255); // pass anything from 0 to 255
}

const texture = new DataTexture(data, textureSize, textureSize, LUMINACE, UnsignedByteType);
varying vec2 vUv;
uniform sampler2D uData;

void main(){
  vec3 color;
  vec4 data = texture2D( uData, vUv );
  gl_FragColor = vec4( data.xyz, 1.0 );
}
  • HalfFloat Texture

要将数字转换为半浮点数,请按照 Three.js 的方式进行:像这样

⚠️ 将数字转换为半浮点精度时请注意 精度错误!
const textureSize = 16
const dataSize = 10;
const data = new Uint16Array(dataSize);

for (let i = 0; i < dataSize) {
  const largeNumber = Math.random() * 10000; // pass anything from 0 to 10000
  data[i] = toHalfFloat(largeNumber);
}

const texture = new DataTexture(data, textureSize, textureSize, LUMINACE, HalfFloatType);
varying vec2 vUv;
uniform sampler2D uData;
uniform float uMax;
uniform float uMin;

void main(){
  vec3 color;
  vec4 data = texture2D( uData, vUv );
  vec4 normalizedData = (data - uMin) / (uMax - uMin);
  gl_FragColor = vec4( data.xyz, 1.0 );
}
  • Float Texture
const textureSize = 16
const dataSize = 10;
const data = new Float32Array(dataSize);

for (let i = 0; i < dataSize) {
  const largeNumber = Math.random() * 10000; // pass anything from 0 to 10000
  data[i] = largeNumber;
}

const texture = new DataTexture(data, textureSize, textureSize, LUMINACE, FloatType);
varying vec2 vUv;
uniform sampler2D uData;
uniform float uMax;
uniform float uMin;

void main(){
  vec3 color;
  vec4 data = texture2D( uData, vUv );
  vec4 normalizedData = (data - uMin) / (uMax - uMin);
  gl_FragColor = vec4( data.xyz, 1.0 );
}

原文链接:Three.js数据转纹理 - BimAnt

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

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

相关文章

通过自动化部署消除人为操作:不断提高提交部署比率

三十年后&#xff0c;我仍然热爱成为一名软件工程师。事实上&#xff0c;我最近读了威尔拉森&#xff08;Will Larson&#xff09;的《员工工程师&#xff1a;超越管理轨道的领导力》&#xff0c;这进一步点燃了我以编程方式解决复杂问题的热情。知道雇主继续照顾员工、原则和杰…

222,完全二叉树的节点数

给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最…

2024/4/2—力扣—二叉树的最近公共祖先

代码实现&#xff1a; 思路&#xff1a; 递归判断左子树和右子树&#xff0c;查找p或者q是否在当前节点的子树上 1&#xff0c;在同一子树上&#xff0c;同一左子树&#xff0c;返回第一个找到的相同值&#xff0c;同一右子树上&#xff0c;返回第一个找到的相同值 2&#xff0…

ES学习日记(十一)-------Java操作ES之基本操作

前言 此篇博客还是一些基础操作&#xff0c;没什么可写的&#xff0c;需要的同学直接抄作业进行测试就可以 上一节写了连接和测试新增操作,这一节写java操作ES的基本操作,也就是增删改查,在这里补充一点知识,我们之前用了指定的索引进行指定添加 有一个情况是,如果我们指定了…

git提交代码时报错,提不了

问题 今天在换了新电脑&#xff0c;提交代码时报错 ✖ eslint --fix found some errors. Please fix them and try committing again. ✖ 21 problems (20 errors, 1 warning) husky > pre-commit hook failed (add --no-verify to bypass) 解决 通过 --no-verify 解决&…

✌2024/4/3—力扣—最长回文子串

代码实现&#xff1a; 解法一&#xff1a;动态规划——回文子串 char* longestPalindrome(char *s) {int n strlen(s);if (s NULL || n 0 || n 1) {return s;}int dp[n][n];memset(dp, 0, sizeof(dp));for (int i n - 1; i > 0; i--) { // 从下到上for (int j i; j &l…

C语言面试题之判定字符是否唯一

判定字符是否唯一 实例要求 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同 实例分析 1、使用一个大小为 256 的bool数组 charSet 来记录字符是否出现过&#xff1b;2、遍历字符串时&#xff0c;如果字符已经在数组中标记过&#xff0c;则返回 false&a…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十四篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…

腾讯视频号新玩法,有人已经“遥遥领先”了~

我是王路飞。 抖音的流量红利让用户看到了新的变现方式。 短视频、开直播、开店铺卖货、图文带货等等&#xff0c;都是依托于抖音这个平台去发展起来的。 而抖音的巨大成功&#xff0c;被吸引到的还有互联网行业巨头&#xff0c;比如腾讯。 而腾讯视频号的上线就表明了&…

智能网联汽车自动驾驶数据记录系统DSSAD数据元素

目录 第一章 数据元素分级 第二章 数据元素分类 第三章 数据元素基本信息表 表1 车辆及自动驾驶数据记录系统基本信息 表2 车辆状态及动态信息 表3 自动驾驶系统运行信息 表4 行车环境信息 表5 驾驶员操作及状态信息 第一章 数据元素分级 自动驾驶数据记录系统记录的数…

git Failed to connect to 你的网址 port 8282: Timed out

git Failed to connect to 你的网址 port 8282: Timed out 出现这个问题的原因是&#xff1a;原来的仓库换了网址&#xff0c;原版网址不可用了。 解决方法如下&#xff1a; 方法一&#xff1a;查看git用户配置是否有如下配置 http.proxyhttp://xxx https.proxyhttp://xxx如果…

DIY可视化UniApp表格组件

表格组件在移动端的用处非常广泛&#xff0c;特别是在那些需要展示结构化数据、进行比较分析或提供详细信息的场景中。数据展示与整理&#xff1a;表格是展示结构化数据的理想方式&#xff0c;特别是在需要展示多列和多行数据时。通过表格&#xff0c;用户可以轻松浏览和理解数…

2024新版PHP在线客服系统多商户AI智能在线客服系统源码机器人自动回复即时通讯聊天系统源码PC+H5

搭建环境&#xff1a; 服务器 CPU 2核心 ↑ 运存 2G ↑ 宽带 5M ↑ 服务器操作系统 Linux Centos7.6-7.9 ↑ 运行环境&#xff1a; 宝塔面板 Nginx1.18- 1.22 PHP 7.1-7.3 MYSQL 5.6 -5.7 朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持…

深度学习理论基础(七)Transformer编码器和解码器

学习目录&#xff1a; 深度学习理论基础&#xff08;一&#xff09;Python及Torch基础篇 深度学习理论基础&#xff08;二&#xff09;深度神经网络DNN 深度学习理论基础&#xff08;三&#xff09;封装数据集及手写数字识别 深度学习理论基础&#xff08;四&#xff09;Parse…

能不能换DB吗?--抽象工厂模式

1.1 就不能不换DB吗&#xff1f; 都是换数据库惹的祸。 "我们团队前段时间用.net的C#来开发好一个项目&#xff0c;是给一家企业做的电子商务网站&#xff0c;是用SQL Server作为数据库的&#xff0c;应该说上线后除了开始有些小问题&#xff0c;基本都还可以。而后&#…

婴儿洗衣机买几公斤的合适?四大黑马婴儿洗衣机强势来袭

选择适合婴儿使用的洗衣机&#xff0c;是每个家长都关心的问题。在选择的时候&#xff0c;我们需要考虑一些因素&#xff0c;比如安全性、易操作性和洗涤效果等。同时&#xff0c;也要根据婴儿的年龄和需求来选择合适的洗衣机。婴儿洗衣机的出现&#xff0c;为宝妈们带来了极大…

2023年下半年中级软件设计师上午真题及答案解析

01 02 03 04 05 06 07 08 09 10 篇幅有限&#xff0c;私我获取免费完整 pdf文件

如何魔改 diffusers 中的 pipelines

如何魔改 diffusers 中的 pipelines 整个 Stable Diffusion 及其 pipeline 长得就很适合 hack 的样子。不管是通过简单地调整采样过程中的一些参数&#xff0c;还是直接魔改 pipeline 内部甚至 UNet 内部的 Attention&#xff0c;都可以实现很多有趣的功能或采样生图结果。 本…

JVM 全景图

今天我重新复习了一下 jvm 的一些知识点。我以前觉得 jvm 的知识点很多很碎&#xff0c;而且记起来很困难&#xff0c;但是今天我重新复习了一下&#xff0c;对这些知识点进行了简单的梳理之后&#xff0c;产生了不一样的看法。虽然 jvm 的知识点很碎&#xff0c;但是如果你真的…

创建型模式--1.单例模式【巴基速递】

1. 巴基的订单 在海贼世界中&#xff0c;巴基速递是巴基依靠手下强大的越狱犯兵力&#xff0c;组建的集团海贼派遣公司&#xff0c;它的主要业务是向世界有需要的地方输送雇佣兵&#xff08;其实是不干好事儿&#xff09;。 自从从特拉法尔加罗和路飞同盟击败了堂吉诃德家族 &…