当前位置: 首页 > news >正文

Unity Shader入门(更新中)

参考书籍: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.xdnf.cn/news/587395.html

相关文章:

  • python安装与使用
  • Java的列表、集合、数组的添加一个元素各自用的什么方法?
  • 【论文阅读】——AN EXPRESSIVE REPRESENTATION OF GENERAL 3D SHAPES
  • Linux环境基础开发工具->vim
  • 实现FAT12文件管理
  • 线性回归模型的参数估计
  • AutoMapper .net Framework 的 Model转换扩展方法
  • python学习 day5
  • 部署人工智能Qlib量化投资平台
  • 你通俗易懂的理解——线程、多线程与线程池
  • 架构实践中,指标体系如何科学建立?构建指标体系的五层结构模型是什么?不同架构风格下的指标体系有怎样的差异?
  • 腾讯2025年校招笔试真题手撕(二)
  • 欧拉降幂(JAVA)蓝桥杯乘积幂次
  • Windows 平台 TCP 通信开发指南
  • Redisson分布式锁案列和源码解读
  • WebBuilder快速开发平台:企业级开发的未来
  • 语义分割的image
  • linux arm架构下如何搭建内网穿透
  • linux 下 scp 传文件时保留文件夹中的原格式属性
  • vue3+element-plus+pinia完整搭建好看简洁的管理后台
  • 关于Python编程语言的详细介绍,结合其核心特性、应用领域和发展现状,以结构化方式呈现:
  • 邮箱验证码登录流程
  • [每日一题] 3362. 零数组变换 iii
  • MapReduce-Top N程序编写与运行
  • 修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题
  • 基于大模型的胫腓骨干骨折全周期预测与治疗方案研究报告
  • 五分钟学会如何封装Jsckson工具类
  • OpenCV CUDA 模块图像过滤------创建一个高斯滤波器函数createGaussianFilter()
  • Python中的并发编程
  • Java集合框架与三层架构实战指南:从基础到企业级应用