3.js - 顶点着色器、片元着色器的联系
1、定义与功能
顶点着色器
顶点着色器,是图形渲染管线中的第一个可编程阶段,它的主要任务是,处理从CPU发送到GPU的顶点数据,包括:1、顶点位置的变换(如:模型空间 -> 世界空间 -> 视图控件 -> 投影空间的转换)2、光照计算3、传递数据到后续的渲染阶段(`传递数据到片元着色器`)
片元着色器
片元着色器,是图形渲染管线中处理像素级渲染的阶段,它接收由`顶点着色器插值得到的片元`(即:屏幕上的像素或像素的候选者),并生成最终的颜色和其他与像素相关的数据
2、顶点/片元之间的数据传递
1、顶点数据传递:顶点着色器处理完顶点数据后,会将结果(包括位置、颜色、纹理坐标等)传递给片元着色器,这通常是通过 `varying` 变量来实现的,这些变量,在光栅化阶段被线性插值,以生成每个片元对应的值2、光照与纹理:在某些情况下,顶点着色器会执行初步的光照计算,并将结果作为输入,传递给片元着色器,片元着色器则负责执行更详细的光照计算,如:计算每个像素上的光照强度和颜色,同时,片元着色器还负责纹理映射,即:从纹理中读取颜色信息,并应用到相应的像素上
3、渲染流程
在渲染流程中,顶点着色器首先处理顶点数据,然后将处理后的数据传递给光栅化器,光栅化器将顶点数据转换为片元数据,并将这些数据,以及顶点着色器输出的varying变量,传递给片元着色器,最后,片元着色器处理这些数据,生成最终的颜色值,并将其写入帧缓冲区以供显示
4、关系总结
依赖关系:1、片元着色器,依赖于,顶点着色器的输出数据,来进行进一步的计算和处理,没有顶点着色器提供的顶点数据、varying变量插值结果,片元着色器就无法正常工作。2、顶点着色器和片元着色器共同协作,完成了从顶点数据到像素颜色的整个渲染过程。
码子
vertex.glsl 顶点着色器
`precision关键字:指定后续声明的浮点数类型的精度,在图形渲染中,特别是使用GPU进行渲染时,浮点数的精度可以根据需要进行调整,以平衡渲染质量和性能,precision lowp float; // 后续,所有浮点数的精度,为lowp(低精度:-2^8 - 2^8)precision lowp mediump; // 后续,所有浮点数的精度,为mediump(中精度:-2^10 - 2^10)precision lowp highp; // 后续,所有浮点数的精度,为highp(高精度:-2^16 - 2^16)`
precision lowp float;`attribute:在顶点着色器中声明变量(在较新的GLSL版本中,attribute已经被in关键字所取代)vec3:一个数据类型,代表一个三维向量 `
attribute vec3 position;uniform mat4 modelMatrix; `modelMatrix模型矩阵:用于将顶点,从模型空间 -> 世界空间`
uniform mat4 viewMatrix; `viewMatrix视图矩阵:用于将顶点,从世界空间 -> 观察空间`
uniform mat4 projectionMatrix; `projectionMatrix投影矩阵:用于将顶点,从观察空间 -> 裁剪空间,并最终映射到屏幕坐标上`attribute vec2 uv; `uv:每个顶点的纹理坐标(u, v)`
varying vec2 vUv; `vUv:传递给片段着色器的纹理坐标`// 获取时间
uniform float uTime; `uTime:一个统一变量,用于传递时间信息,可以用于动画效果`varying float vElevation;void main() {`将输入的纹理坐标传递给片段着色器`vUv = uv;`用于,将顶点的位置,从模型空间 -> 世界空间`vec4 modelPosition = modelMatrix*vec4(position, 1.0);`顶点着色器,处理的每个顶点都有一个位置(position),这个位置是一个三维向量(vec3),包含x、y、z三个坐标`// modelPosition.x += 1.0;// modelPosition.z += 1.0;// modelPosition.z += modelPosition.x;` 1、通过,正弦函数,动态地调整顶点的z坐标,创建了一种基于时间和顶点位置的波动效果基于顶点x坐标和时间的正弦波值,并将其幅度缩放为原始值的5%,意味着,随着uTime(时间)的增加,顶点的z坐标,将根据其在x轴上的位置以正弦波的形式变化。2、sin((modelPosition.x + uTime) * 10.0),为什么乘以10呢?因为,正弦函数sin的周期是2π,意味着,它完成一个完整的波形(从0到1,再到0)需要2π个单位但是,对(modelPosition.x + uTime)乘以10之后,实际上,是在对,正弦函数sin的周期,进行缩放,使得原本需要2π单位才能完成的波形,现在只需要(2π / 10) = 0.2π单位,就能完成一次完整的周期,所以,乘以10.0,意味着,波形在相同的空间或时间范围内,完成了更多的周期,从而增加了波形的频率 `modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;modelPosition.z += sin((modelPosition.y+uTime)*10.0)*0.05;vElevation = modelPosition.z; `将调整后的z值传递给片段着色器``计算顶点在裁剪空间中的位置`gl_Position = projectionMatrix*viewMatrix*modelPosition;
}相关文章:
3.js - 顶点着色器、片元着色器的联系
1、定义与功能 顶点着色器 顶点着色器,是图形渲染管线中的第一个可编程阶段,它的主要任务是,处理从CPU发送到GPU的顶点数据,包括:1、顶点位置的变换(如:模型空间 -> 世界空间 -> 视图控件…...
kotlin简介
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。 Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。 在Google I/O 2017…...
Mintegral出海系列:解锁全球应用商店新增长路径
在全球化竞争的浪潮中,面对打法各异的应用和游戏品类,以及全球数百个环境不同的国家和地区,开发者们正面临着前所未有的挑战。Mintegral「出海ing」系列专题内容,助力出海开发者选准赛道探索新的增长路径。 据近期数据显示&#x…...
Qt 哈希加密之 QCryptographicHash
【写在前面】 QCryptographicHash 是 Qt 框架中提供的一个类,它用于实现加密散列函数,也就是我们常说的哈希函数。哈希函数能够将任意长度的数据转换为固定长度的哈希值,这个哈希值通常用于数据的完整性校验、密码存储等场景。 什么是哈希函数…...
渗透第二次作业
目录 简述rce漏洞 可能产生rce漏洞的函数 RCE代码执行漏洞示例 贷齐乐系统多处SQL注入漏洞 编辑 爆出库名 爆出表名 爆出表下的列名 查flag数据 简述rce漏洞 rce漏洞,即远程代码执行和远程命令执行漏洞。这种漏洞允许攻击者在后台服务器上远程注入操作…...
42.【C语言】冒泡排序
目录: 冒泡排序 *核心思想 *分析 *代码 *优化 15.冒泡排序(bubble sort) *核心思想:两两相邻的元素进行比较,满足条件则两者交换 *分析 现要求升序排序 输入: 9 8 7 6 5 4 3 2 1 0 输出:0 1 2 3 4 5 6 7 8 9 下面展示一趟冒泡排…...
Linux安全与高级应用(七)深入Linux Shell脚本编程:循环与分支结构的高级应用
文章目录 深入Linux Shell脚本编程:循环与分支结构的高级应用一、循环结构详解1. for循环1.1 应用示例:检查主机状态 2. while循环2.1 应用示例:猜价格游戏 二、分支结构详解1. if语句1.1 单分支结构1.2 双分支结构1.3 多分支结构 2. case语句…...
python爬虫滑块验证及各种加密函数(基于ddddocr进行的一层封装)
git链接: https://github.com/JOUUUSKA/spider_toolsbox 这里写目录标题 一.识别验证码1、识别英文+数字验证码2、识别滑块验证码3、识别点选验证码 一.识别验证码 git链接: https://github.com/JOUUUSKA/spider_toolsbox 创作不易记得stars 1、识别英文…...
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
文章目录 前言一、miniconda和anaconda的关系1、Anaconda2、Miniconda3、总结 二、下载miniconda(清华镜像链接)三、安装miniconda1、安装2、或许要手动加载 ~/.bashrc 四、配置 命令1、查看anaconda安装博文2、取消默认进入conda(base&#…...
说一下Android中的IdleHandler
IdleHandler 是 Android 中的一个接口,常用于在主线程空闲时执行一些低优先级的任务。 作用: 它提供了一种在主线程空闲时执行额外操作的机制,能够优化应用的性能和资源利用。 工作原理: 当主线程没有其他任务需要处理ÿ…...
Flake8 和 Autopep8 使用指南
Flake8 和 Autopep8 集成到 CI/CD 流程中,确保在代码提交和合并时自动进行检查和格式化,如果Autopep8格式化检查无法通过Flake8校验,说明pycodestyle版本依赖不兼容,参考文章:Flake8 与 Autopep8 兼容性指南 Flake8 使…...
OpenHarmony(数据)通信协议、数据存储—protobuf
介绍 ProtoBuf(protocol buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。,是一种灵活,高效,自动化机制的结构数据序列化方法比XML更小,更快,更为简单。 本项…...
vue3 依赖注入 vueRouter vuex
目录 01 依赖注入 02 组合式API里面的vueRouter 03 组合式API中的vuex的使用 01 依赖注入 使用场景: 有一个父组件,里头有子组件,有孙组件,有很多后代组件,共享父组件数据。 1.组先组件给后代组件传参 组先组件: 从…...
在Windows上用Visual Studio编译OpenCV
在Windows上编译开源项目,有时候让人痛不欲生,有时候却出奇地顺利。OpenCV属于后者。本文记录这次愉快的过程。 注:OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了大…...
详解2024年最值得推荐的5款CRM软件:如何选择适合企业需求的CRM系统?
在文章开始之前,我们前来了解下:什么是CRM系统? CRM系统,即客户关系管理系统,顾名思义,它是企业用来管理和维护与客户之间关系的重要工具。通过CRM系统,企业能够全面了解客户需求,优…...
2024靠谱的网站建设公司推荐
在现在的互联网社会,一个企业的网站往往是潜在客户对该品牌的第一印象来源。也正因如此,选择一个靠谱的网站建设公司对于确保企业在线形象和功能性至关重要,作为建站行业从业人员,我分享几个选择网站建设公司时应考虑的几个关键因…...
第一天:Java基础与环境搭建
第一天:Java基础与环境搭建 1. 理解Java基本概念 了解Java语言的历史:Java是一种广泛使用的编程语言,由Sun Microsystems(现被Oracle收购)于1995年首次发布。认识Java的特性:包括面向对象、平台无关性&am…...
动画魔法秀:JavaScript前端动画实战指南
标题:动画魔法秀:JavaScript前端动画实战指南 在现代Web开发中,动画不仅能够提升用户体验,还能使网页更加生动有趣。JavaScript作为实现前端动画的重要工具之一,提供了多种方式来创建平滑且吸引人的动画效果。本文将详…...
实训日记day26
NAT服务配置 1.关闭防火墙和selinux [root2 ~]# setenforce 0 [root2 ~]# vim /etc/selinux/config [root2 ~]# systemctl stop firewalld [root2 ~]# systemctl disable firewalld 2.安装nginx (web1和web2) [root2 ~]# yum install -y gcc-c pcre pcr…...
自定义实现一个 Redis 客户端
要自定义实现一个 Redis 客户端并支持密码认证,你可以使用 TCP socket 直接与 Redis 服务器进行通信。下面是如何通过 Java 自定义实现一个简单的 Redis 客户端的详细示例,包括如何发送密码进行认证。 Redis 协议概述 Redis 使用一种称为 RESP…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
