Unity Shader入门(更新中)

news2025/5/23 10:50:07

参考书籍:UnityShader入门精要(冯乐乐著)
参考视频:Bilibili《Unity Shader 入门精要》
写在前面:前置知识需要一些计算机组成原理线性代数Unity的基础
这篇记录一些学历过程中的理解和笔记(更新中)

文章目录

  • 一、 渲染流水线
    • 📚️1.1 什么是流水线
    • 📚️1.2 什么是渲染流水线
    • 📚️1.3 CPU流水线
    • 📚️1.4 GPU流水线
      • 1.4.1 几何阶段
      • 1.4.2 光栅化阶段
    • 📚️1.5什么是Shader
  • 二、Unity Shader基础

一、 渲染流水线

📚️1.1 什么是流水线

🚩 流水线其实就是并行和串行的区别,非流水线的串行工序只能完成一个目标后去制作下一个目标,而流水线工序使得每个工序都在同时工作,如图参考。
在这里插入图片描述

📚️1.2 什么是渲染流水线

🚩 将流水线运用于图像渲染中为渲染流水线,渲染流水线是一个概念流水线,实际的流水线需要配合硬件的操作,是便于理解和流水线功能划分而提出的。
在这里插入图片描述
渲染流水线的三个概念阶段:应用阶段几何阶段光栅化阶段

  • ✔️ 应用阶段:
    这个阶段由应用主导,通常由CPU负责实现。开发者可以进行大部分操作:准备场景数据(摄像机位置、模型摆放、光源摆放)、粗粒度剔除(剔除一些遮挡物而不递交给几何阶段,比如Unity中的遮挡剔除、视锥剔除、LOD选择、批处理就属于应用阶段)、设置渲染状态(设置材质、纹理、使用的Shader)。最终输出渲染图元传递给下一个阶段,图元可以是点、线、三角面等类型。

  • ✔️ 几何阶段:
    几何阶段通常在GPU上进行,负责每个图元的操作,通过输入图元进一步处理转换为屏幕空间的二维坐标,输出顶点信息传递给下一个阶段。简单来说就是操作图元、转换屏幕坐标、输出顶点信息,这一部分内容在后续GPU流水线部分详细展开。

  • ✔️ 光栅化阶段
    光栅化阶段在GPU上进行,通过输入的顶点信息最终产生屏幕像素,渲染输出最终图像。根据上个阶段的顶点信息决定图元中的哪些像素应该被绘制在屏幕上,后续GPU流水线部分详细展开。

参考部分:遮挡剔除、网格的细节级别 (LOD)、绘制调用批处理
补充部分:
图元:图元的类型是与渲染内容的几何描述相关,比如3D模型用三角面描述,UI边框和和线框渲染用线描述、粒子用点描述。

📚️1.3 CPU流水线

🚩 渲染流水线的起点是CPU,也就是应用阶段,共有三个阶段:把数据加载到显存中、设置渲染状态、调用 DrawCall。

  1. ✔️ 把数据加载到显存中:
    因为显卡对显存的访问速度更快,并且显卡对于大部分RAM没有直接访问权力,所以要将渲染数据从硬盘加载到显存中。过程如下图,硬盘→ RAM系统内存 → 显存。
    在这里插入图片描述
  2. ✔️ 设置渲染状态:
    定义场景中的网格需要怎么样被渲染,比如使用的顶点着色器、片元着色器、光源、材质等。
  3. ✔️ 调用 DrawCall:
    CPU像GPU发送渲染指令,命令指向一个需要被渲染的图元,GPU根据设置渲染状态输出到屏幕上(GPU流水线)。

📚️1.4 GPU流水线

🚩 GPU获得渲染命令后,进行一系列操作最终把图元渲染到屏幕上。
🚩 几何阶段进行:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射。光栅化阶段进行:三角形设置、三角形遍历、片元着色器、逐片元操作。
几何阶段和光栅化阶段

1.4.1 几何阶段

🚩 有的同学容易将几何阶段和光栅化阶段中的内容混淆,其实和字面意思一样几何阶段就是还在三维时的操作,也就是将三维逐步转为二维的操作,光栅化阶段则处理的是怎么转换为像素,所以是将几何阶段的结果及二维的屏幕结果进行操作。

  1. ✔️ 顶点着色器:
    顶点着色器用于处理顶点,每个顶点都会调用一次顶点着色器,顶点着色器需要完成坐标转换和顶点光照,如图所示。我们可以通过改变顶点坐标模拟水面、布料等就是通过顶点着色器,所以顶点着色器阶段是可编程的。
    顶点着色器处理顶点
    其中坐标转换是将顶点从模型空间转换到齐次裁剪空间
    模型空间转换到齐次裁剪空间

  2. ✔️ 裁剪:
    图元和摄像机的关系有:完全在视野内、部分在视野内、完全在视野内
    对于完全在视野内的图元直接传递给下一个流水线,对于完全在视野外的图元不继续向下传递,而部分在视野内的图元则需要进行裁剪(Clipping)处理,裁剪规则如图所示。
    裁剪

  3. ✔️ 屏幕映射:
    在顶点光栅化时我们获得了齐次裁剪空间的坐标这时我们进一步转换到屏幕坐标系下,这时就与屏幕的分辨率有关系了,而z坐标信息会进一步传递到光栅化阶段做处理。
    在这里插入图片描述

1.4.2 光栅化阶段

  1. ✔️ 三角形设置:
    我们得到了三角形的顶点信息,但是不知道三角形的覆盖情况,进一步获得三角形的边界表达方式,计算三角形网格表示数据计算计算三角形设置。

  2. ✔️ 三角形遍历:
    三角形遍历检查每个像素是否被三角形覆盖,如果覆盖的话就会生成片元,使用三角形的3个顶点对覆盖区域深度进行插值,最终输出片元序列,片元并不是像素,片元包含了很多信息用于计算像素的最终颜色。
    在这里插入图片描述

  3. ✔️ 片元着色器:
    片元着色器是一个重要的可编程着色器阶段,片元着色器主要是计算每个片元的最终颜色和其他属性
    在这里插入图片描述

  4. ✔️ 逐片元操作:
    对像素正在产生影响的阶段是逐片元操作,这一阶段会进行可见性测试,片元需要经过深度测试、模板测试等,如果片元通过了所有测试则需要与缓冲区的的颜色进行合并或者混合
    在这里插入图片描述
    经过以上计算和测试模型图元显示到了屏幕上,为了避免看见正在光栅化的图元,GPU会使用双重缓冲策略,那么场景渲染则像是在幕后发生一样即后置缓冲,后置缓冲完成GPU交换前置缓冲中的内容,保证了我们看到的图片总是连续的。

📚️1.5什么是Shader

🚩 Shader就是渲染流水线的一部分,GPU上可高度编程的阶段,由着色器编译最终代码会在GPU上运行。

二、Unity Shader基础

这里不会过多的赘述Material材质、Shader在Unity中的使用步骤,具体可以参考文章开头的书籍和视频链接

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

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

相关文章

嵌入式学习的第二十六天-系统编程-文件IO+目录

一、文件IO相关函数 1.read/write cp #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include<unistd.h> #include<string.h>int main(int argc, char **argv) {if(argc<3){fprintf(stderr, …

珠宝课程小程序源码介绍

这款珠宝课程小程序源码&#xff0c;基于ThinkPHPFastAdminUniApp开发&#xff0c;功能丰富且实用。ThinkPHP提供稳定高效的后台服务&#xff0c;保障数据安全与处理速度&#xff1b;FastAdmin助力快速搭建管理后台&#xff0c;提升开发效率&#xff1b;UniApp则让小程序能多端…

KNN模型思想与实现

KNN算法简介 核心思想&#xff1a;通过样本在特征空间中k个最相似样本的多数类别来决定其类别归属。"附近的邻居确定你的属性"是核心逻辑 决策依据&#xff1a;采用"多数表决"原则&#xff0c;即统计k个最近邻样本中出现次数最多的类别 样本相似性度量 …

fscan教程1-存活主机探测与端口扫描

实验目的 本实验主要介绍fscan工具信息收集功能&#xff0c;对同一网段的主机进行存活探测以及常见服务扫描。 技能增长 通过本次实验的学习&#xff0c;了解信息收集的过程&#xff0c;掌握fscan工具主机探测和端口扫描功能。 预备知识 fscan工具有哪些作用&#xff1f; …

腾讯2025年校招笔试真题手撕(三)

一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…

怎样通过神经网络估计股票走向

本博文将教会你如何通过神经网络建立股票模型并对其进行未来趋势估计&#xff0c;尽管博主已通过此方法取得一定利润&#xff0c;但是建议大家不要过分相信AI。本博文仅用于代码学习&#xff0c;请大家谨慎投资。 一、通过爬虫爬取股票往年数据 在信息爆炸的当今时代&#xf…

【RocketMQ 生产者和消费者】- 生产者启动源码-上报生产者和消费者心跳信息到 broker(3)

文章目录 1. 前言2. sendHeartbeatToAllBrokerWithLock 上报心跳信息3. prepareHeartbeatData 准备心跳数据4. sendHearbeat 发送心跳上报请求5. broker 处理心跳请求5.1 heartBeat 处理心跳包5.2 createTopicInSendMessageBackMethod 创建重传 topic5.3 registerConsumer 注册…

Python----循环神经网络(Word2Vec的优化)

一、负采样 基本思想&#xff1a; 在训练过程中&#xff0c;对于每个正样本&#xff08;中心词和真实上下文词组成的词对&#xff09;&#xff0c;随机采样少量&#xff08;如5-20个&#xff09;负样本&#xff08;中心词与非上下文词组成的词对&#xff09;。 模型通过区分正…

Simon J.D. Prince《Understanding Deep Learning》

学习神经网络和深度学习推荐这本书&#xff0c;这本书站位非常高&#xff0c;且很多问题都深入剖析了&#xff0c;甩其他同类书籍几条街。 多数书&#xff0c;不深度分析、没有知识体系&#xff0c;知识点零散、章节之间孤立。还有一些人Tian所谓的权威&#xff0c;醒醒吧。 …

开搞:第四个微信小程序:图上县志

原因&#xff1a;我换了一个微信号来搞&#xff0c;因为用同一个用户&#xff0c;备案只能一个个的来。这样不行。所以我换了一个。原来注册过小程序。现在修改即可。注意做好计划后&#xff0c;速度备案和审核&#xff0c;不然你时间浪费不起。30元花起。 结构&#xff1a; -…

Seata源码—7.Seata TCC模式的事务处理一

大纲 1.Seata TCC分布式事务案例配置 2.Seata TCC案例服务提供者启动分析 3.TwoPhaseBusinessAction注解扫描源码 4.Seata TCC案例分布式事务入口分析 5.TCC核心注解扫描与代理创建入口源码 6.TCC动态代理拦截器TccActionInterceptor 7.Action拦截处理器ActionIntercept…

【语法】C++的map/set

目录 平衡二叉搜索树 set insert() find() erase() swap() map insert() 迭代器 erase() operator[] multiset和multimap 在之前学习的STL中&#xff0c;string&#xff0c;vector&#xff0c;list&#xff0c;deque&#xff0c;array都是序列式容器&#xff0c;它们的…

vue vite textarea标签按下Shift+Enter 换行输入,只按Enter则提交的实现思路

注意input标签不能实现&#xff0c;需要用textarea标签 直接看代码 <template><textareav-model"message"keydown.enter"handleEnter"placeholder"ShiftEnter 换行&#xff0c;Enter 提交"></textarea> </template>&l…

深入理解 PlaNet(Deep Planning Network):基于python从零实现

引言&#xff1a;基于模型的强化学习与潜在动态 基于模型的强化学习&#xff08;Model-based Reinforcement Learning&#xff09;旨在通过学习环境动态的模型来提高样本效率。这个模型可以用来进行规划&#xff0c;让智能体在不需要与真实环境进行每一次决策交互的情况下&…

仿腾讯会议——视频发送接收

1、 添加音频模块 2、刷新图片&#xff0c;触发重绘 3、 等比例缩放视频帧 4、 新建视频对象 5、在中介者内定义发送视频帧的函数 6、完成发送视频的函数 7、 完成开启/关闭视频 8、绑定视频的信号槽函数 9、 完成开启/关闭视频 10、 完成发送视频 11、 完成刷新图片显示 12、完…

从3.7V/5V到7.4V,FP6291在应急供电智能门锁中的应用

在智能家居蓬勃发展的当下&#xff0c;智能门锁以其便捷、安全的特性&#xff0c;成为现代家庭安防的重要组成部分。在智能门锁电量耗尽的情况下&#xff0c;应急电源外接移动电源&#xff08;USB5V输入&#xff09; FP6291升压到7.4V供电可应急开锁。增强用户在锁具的安全性、…

【人工智障生成日记1】从零开始训练本地小语言模型

&#x1f3af; 从零开始训练本地小语言模型&#xff1a;MiniGPT TinyStories&#xff08;4090Ti&#xff09; &#x1f9ed; 项目背景 本项目旨在以学习为目的&#xff0c;从头构建一个完整的本地语言模型训练管线。目标是&#xff1a; ✅ 不依赖外部云计算✅ 完全本地运行…

Selenium-Java版(frame切换/窗口切换)

frame切换/窗口切换 前言 切换到frame 原因 解决 切换回原来的主html 切换到新的窗口 问题 解决 回到原窗口 法一 法二 示例 前言 参考教程&#xff1a;Python Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili 上期文章&#xff1a;Sel…

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异

在 Solana 链上&#xff0c;Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型&#xff0c;到后续的自动迁移与交易市场&#xff0c;Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态

星云智控v1.0.0产品发布会圆满举行&#xff1a;以创新技术重构物联网监控新生态 2024年5月15日&#xff0c;成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…