threeJs着色器

news2024/11/25 16:36:18

一、着色器

着色器(Shaders )是一种使用GLSL(OpenGL Shading Language)编写并在GPU上运行的程序。它们被用于定位几何体的每个顶点,并为该几何体的每个可见像素着色。使用“像素Pixel”来描述其实并不准确,因为渲染的每个点不一定与屏幕上的每个像素相匹配,因此我们更倾向于使用术语“片元fragment”。
之后我们会向着色器发送大量数据,如顶点坐标、网格变换、摄像机及其视野范围的信息、颜色、纹理、灯光、雾等参数。然后,GPU会按照着色器的指示处理所有的这些数据,接着几何体便出现在渲染中。

Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像素同时下达。也就是说,你的代码必须根据像素在屏幕上的不同位置执行不同的操作。就像活字印刷,你的程序就像一个 function(函数),输入位置信息,输出颜色信息,当它编译完之后会以相当快的速度运行
在这里插入图片描述

二、顶点着色器和片元着色器

WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。
————————————————

1、顶点着色器

顶点着色器(Vertex Shader)的作用是定位几何体的顶点。其思想是发送顶点位置、网格变换(如定位position、旋转rotation和缩放scale)、摄影机信息(如定位position、旋转rotation和视野fov)。然后,GPU将按照顶点着色器中的指示处理所有这些信息,以便将顶点投影到2D空间,该空间将成为我们的渲染render,也就是我们的画布canvas

顶点着色器首先运行; 它接收attributes, 计算/操纵每个单独顶点的位置,并将其他数据(varyings)传递给片元着色器。
————————————————

2、片元着色器

片元着色器的作用是为几何体的每个可见片元(像素)进行着色。
我们会创建片元着色器,可以通过使用uniform将数据(像是颜色)和着色器发送至GPU,之后GPU就会按照指令对每个片元进行着色。

片元(或像素)着色器后运行; 它设置渲染到屏幕的每个单独的“片元”(像素)的颜色。

三、着色器材质

着色器材质(ShaderMaterial)是一个用GLSL编写的小程序 ,在GPU上运行。它能够提供 materials 之外的效果,也可以将许多对象组合成单个GeometryBufferGeometry以提高性能。
shader中有三种类型的变量: uniforms, attributes, varying

关键字(变量类型)数据传递声明变量
uniformsjavascript 顶点、片元着色器声明非顶点数据变量
attributesjavascript 片元着色器声明顶点数据变量
varying顶点着色器->片元着色器声明需要插值计算的顶点变量
  • Uniforms是所有顶点都具有相同的值的变量。 比如灯光,雾,和阴影贴图就是被储存在uniforms中的数据。
    uniforms可以通过顶点着色器和片元着色器来访问。
  • Attributes 与每个顶点关联的变量。例如,顶点位置,法线和顶点颜色都是存储在attributes中的数据。attributes 只
    可以在顶点着色器中访问。
  • Varyings 是从顶点着色器传递到片元着色器的变量。对于每一个片元,每一个varying的值将是相邻顶点值的平滑插值。

————————————————
炫彩蛋示例
在这里插入图片描述

var geometry= new THREE.SphereGeometry(10, 30, 20);
// 创建着色器材质
var material= new THREE.ShaderMaterial({
	//顶点着色器
    vertexShader: `
    varying vec3 vNormal;
    void main() {
        //将attributes的normal通过varying赋值给了向量vNormal
        vNormal = normal;
      //projectionMatrix:投影变换矩阵 modelViewMatrix:相机坐标系的变换矩阵 y值乘以1.4得到形如鸡蛋的几何体
        gl_Position = projectionMatrix * modelViewMatrix * vec4( position.x, position.y * 1.4, position.z, 1.0 );
    }
    `,
    // 片元着色器
    fragmentShader: `
        //片元着色器同样需要定义varying vec3 vNormal;
    varying vec3 vNormal;
    void main() {
                //vNormal是一个已经归一化的三维向量
        float pr = (vNormal.x + 1.0) / 2.0; //pr红色通道值范围为0~1
        float pg = (vNormal.y + 1.0) / 2.0; //pg绿色通道值范围为0~1
        float pb = (vNormal.z + 1.0) / 2.0; //pb蓝色通道值范围为0~1
        gl_FragColor=vec4(pr, pg, pb, 1.0); //最后设置顶点颜色,点与点之间会自动插值
    }
    `
})
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh)

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

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

相关文章

神经网络小结:训练的全过程

这一节我们主要是将之前的知识穿起来,形成一个整体。如果之前的没看过可以回翻一下专栏。但是在整体回归之前,我们还需要学习一个小知识点——随机初始化 随机初始化 在神经网络中,我们大致的训练流程就是:通过前向传播得出当前…

指针和数组--指针和二维数组的关系

指针和二维数组的关系 目录 一、二维数组的行地址和列地址 二、通过二维数组的行指针和列指针来引用二维数组元素 一、二维数组的行地址和列地址 在C语言中,可将一个二维数组看成是由若干个一维数组构成的。例如若有下面的定义: int a[3][4]&#xf…

8、DuiLib创建子窗口

文章目录 1、创建子窗口2、创建子窗口 XML 配置文件 1、创建子窗口 一个大规模的应用不可能只有一个窗口,之前我们的案例都是在一个窗口实现的,接下来我们实现一个关于窗口,来介绍如何通过 DuiLib 实现子窗口管理。 2、创建子窗口 XML 配置…

小红书种草软文怎么写?教你几招

小红书种草软文写得好,能打消用户的疑虑,吸引更多的用户关注和购买你的产品,从而获得源源不断的流量和口碑,小红书种草软文怎么写?接下来伯乐网络传媒就来给大家讲解一下,教你几招超实用的方法!…

MMSegmentation V0.27.0官方问题(包含多尺度设置)(四)

1、在单个 GPU 上再现性能 #179(添加链接描述) 2、如何使用 PyTorch 的 WeightedRandomSampler 或编写自定义采样器添加链接描述 4、使用独立的分段器 #2931添加链接描述 5、How to change the training policy from Iter to Epoch based on the existin…

【产品运营】如何通过数据分析掌握用户行为?

对于运营来说,需要掌握用户行为来制定不同的运营策略。而用户行为是通过数据分析得出的,那么,具体的数据分析是哪些数据,不同的数据又有什么区别? 通过本文能够学到什么? 快速了解一款APP。行业趋势&#…

完美解决 ---latex运行正常,但是公式显示有问题,latex公式不显示等号 = 和加号 +

文章目录 一、问题展示二、分析原因三、 我的解决办法四、 \usepackage{txfonts}宏包是什么?五、\usepackage{amsmath}宏包是什么?总结 一、问题展示 latex运行正常,但是公式显示有问题,latex公式不显示等号 和加号 二、分析原…

C++基础(9)——文件操作

前言 本文主要介绍了C中文件操作基本知识 5.1:C语言使用标准C库函数读写文件复习 fgets、fputs(读写文本文件) int main(int argc, char *argv[]) {FILE *file;file fopen("a.txt", "a");if (file NULL){perror(&q…

flutter项目启动安卓模拟器不好使的问题

这里写自定义目录标题 一. 新建的flutter项目安卓模拟器不能使用二当上面操作完成以后,新建的flutter项目可以使用安卓模拟器,但是老项目不好使的解决方法 在flutter项目中,ios模拟器好使,安卓模拟器不好使. 分为2种情况: 一. 新建的flutter项目安卓模拟器不能使用 但是在and…

专业的性能测试工具都具备哪些特点?

在软件开发和系统运行过程中,性能是一个关键的指标,直接影响到用户体验和系统的可靠性。为了确保软件和系统的性能达到预期水平,专业的性能测试工具成为必不可少的一环。那专业的性能测试工具都具备哪些特点?探讨其在软件开发和系…

分享几个免费设计生成及参考工具(第三期)

今天来给大家分享几个国外免费的设计生成工具 Uxcrush https://www.uxcrush.com/ 一个收集优秀 Figma 资源的网站,包括网站模板、移动模板、UI套件、图标、设备模型、插画等等。希望为 Figma 用户提供一个方便找到最适合他们设计项目或学习目标的资源站。 unpromp…

用Python写了一个下载网站所有内容的软件,可见即可下

目录标题 前言效果展示环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI,把这些功能放到一起让朋友用起来更方便~ 效果…

FAQ页面在SaaS产品中的应用

随着云计算和软件即服务(SaaS)的快速发展,越来越多的企业选择将业务迁移到云端,以更好地管理和运营他们的业务。在这种背景下,SaaS产品的出现成为了企业管理和运营的新趋势。SaaS产品通过云端的方式,为企业…

【linux】不小心对整个/usr/目录执行了chmod 777命令,如何恢复故障的权限设定

一、问题背景 在安装ansys的时候,脑子抽风,以为/usr/目录是共享目录,直接把所有文件或目录的权限完全设置为全用户自由读写和执行即可。 但是没想到执行了命令sudo chmod -R 777 /usr/命令之后,出现了一大堆sudo权限错误。 较为…

基于AT89S52单片机的多功能电子万年历

1、 项目介绍(设计内容) 基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历…

小程序中各类二维码、小程序码,在各种场景下,长按识别支持情况验证结果

近期由于业务涉及到小程序长按识别加群、关注公众号等业务,各类场景下的支持情况,官方文档也没有特别具体的说明,所以整体做了一些测试。测试结果如下,如果有一些不准确或者未验证的情况,欢迎大家指正、补充哈~ 小程序…

Unity核心8——模型导入

一、模型导入概述 ​ Unity 支持很多模型格式。比如 .fbx /.dae /.3ds /.dxf /.obj 等等。 ​ 99%的模型都不是在 Unity 中制作的,都是美术人员在建模软件中制作,如 3DMax、Maya 等等。 ​ 当他们制作完模型后,虽然 Unity 支持很多模型格式…

公司内部资料!游戏上线前部署准备,就这新手都行

前言 游戏做的差不多了,是时候准备上线测试部署了,选一个靠谱的云服务器厂商还是很重要,这次准备尝试用下华为云的服务,为了在上线前做足准备,先做一次预演,省得到时候手忙脚乱。也给其他的同事做一个文档…

PRL:中国科大观测到单体量子系统中最强的量子互文性

近期,中国科学技术大学郭光灿院士团队在量子物理基本问题研究中取得重要进展。 ——该团队李传锋、许金时等与南开大学陈景灵教授、西班牙塞维利亚大学Adn Cabello教授等合作,实验研究了单体高维量子系统中对应于多体非定域性的量子关联,从而…

数据库管理-第八十三期 炒点冷饭(20230620)

数据库管理 2023-06-20 第八十三期 抄点冷饭1 ORA-040312 Shared Pool3 Library Cache4 Doc ID 2590172.15 Bug 34832725总结 第八十三期 抄点冷饭 上周,借着剩余的两天年假,又从300多个小时中拿了3天出来,加上前后两个周末,去泰…