unity学习-shader(一)

article/2025/11/10 13:41:34

渲染流水线

  • 1 CPU流水线
  • 2 GPU流水线
    • 2.1 顶点着色器
    • 2.2 剪裁
    • 2.3 屏幕映射
    • 2.4 三角形设置
    • 2.5 三角形遍历
    • 2.6 片元着色器
    • 2.7 逐片元操作

渲染流程的三个阶段

  • 应用阶段
    • 需要准备好场景数据,比如摄像机、模型、光源等。
    • 需要再这里做粗粒度剔除(culling)工作,把不可见的物体剔除出去,提高渲染性能。
    • 设置好每个模型的渲染状态,比如材质,纹理,shader等。

这个阶段主要是输出渲染所需的几何信息,即渲染图元(rendering primitives),然后传递给下一个阶段(CPU)

  • 几何阶段
    • 把顶点坐标变换成屏幕空间坐标
    • 输出每个顶点对应的深度值,着色等信息

变换坐标是这个阶段的主要任务,逐顶点、逐多边形操作(GPU)

  • 光栅化阶段
    • 产生屏幕上的像素
    • 渲染出最终图像

决定每个渲染图元中哪些像素被绘制在屏幕上,根据上一阶段得到的逐顶点数据进行插值,然后再逐像素处理

1 CPU流水线

也就是应用阶段,渲染流水线的起点,大致可分为三个阶段:

  • 把数据加在到显存中
    数据加载到显存的流程
    大多数显卡对系统内存是没有访问权限的,并且显卡对显存的访问速度更快。数据加载到显存中后内存(RAM)中的数据就会被移除。
  • 设置渲染状态
    也就是我们使用哪个顶点/片元着色器、光源属性、材质等
  • 调用Draw Call
    Draw Call是CPU发送给GPU的一个指令,会指向一个需要被渲染的图元列表。

2 GPU流水线

GPU的渲染流水线

  • 绿色:完全可编程控制
  • 黄色:可以配置,不可编程
  • 蓝色:GPU固定实现
  • 实线:shader由开发者编程实现
  • 虚线:shader可选

2.1 顶点着色器

顶点着色器的主要任务有两个:坐标变换和计算顶点颜色(如:逐顶点光照)
顶点着色器的主要任务
顶点着色器最基本的工作就是把顶点坐标从模型空间转换到齐次剪裁空间

o.pos = mul(UNITY_MVP,v.position);

类似上面这句代码的功能,就是把顶点坐标从模型空间转换到齐次剪裁坐标系下
将顶点位置变换到齐次剪裁空间下

2.2 剪裁

剪裁就是为了不处理摄像机视野范围外的物体
剪裁出在立方体内的图元

2.3 屏幕映射

屏幕映射是为了把每个图元的x和y坐标转换到屏幕坐标系下
屏幕映射
实际上这个过程就是一个缩放过程,生成的屏幕坐标系和z坐标,一起构成了窗口坐标系。
OpenGL和DirectX屏幕坐标系的差异
需要注意的是,OpenGL把屏幕左下角当做最小的窗口坐标,DirectX把屏幕的左上角当做最小的窗口坐标。所以如果图像倒转了,可能是这个原因。

2.4 三角形设置

计算三角形每条边的两个端点,计算每条边上的像素坐标

2.5 三角形遍历

检查每个像素是否被三角形网格所覆盖,被覆盖了就会生成一个片元。这个过程就是三角形遍历,也叫扫描变换。然后对整个覆盖区域的像素进行插值。
三角形遍历

2.6 片元着色器

片元着色器的输入,是上一个阶段对顶点信息插值得到的结果,输出则是一个或者多个颜色值。
片元着色器计算出的输出颜色
片元着色器仅可以影响单个片元。

2.7 逐片元操作

  • 决定每个片元的可见性。例如:深度测试、模板测试等。
  • 如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行混合
    逐片元阶段的操作
    上图为逐片元操作的流程
    深度测试和模板测试的简化流程
  • 模板测试
    如果开启了模板测试,GPU会首先读取模板缓冲区中该片元位置的模板值,然后将该值和读取到的参考值进行比较,比如:大于或小于舍弃该片元。如果这个片元没有通过这个测试,那么该片元就会被舍弃。不管一个片元有没有通过模板测试,我们都可以根据结果来修改模板缓冲区,比如在失败时模板缓冲区保持不变,通过时将模板缓冲区对应位置值加1等。通常用于限制渲染区域。
  • 深度测试
    基本和模板测试的规则差不多,不同的是,如果一个片元没有通过深度测试,那么它就没有权利更改缓冲区中的值。如果它通过了测试,开发者还可以指定是否要用这个片元的深度值覆盖掉原有的深度值,这是通过开启/关闭深度写入来做到的。
    混合操作的简化流程图
  • 合并
    • 渲染过程就是一个物体接着一个物体画到屏幕上的,每个像素的颜色信息被存储在一个名为颜色缓冲的地方。因此,当我们执行这次渲染时,颜色缓冲中往往已经有了上次渲染之后的颜色结果,那我们使用这次渲染得到的颜色完全覆盖掉之前的结果,还是进行其他处理?这就是合并需要解决的问题。
    • 对于不透明的物体,开发者可以关闭混合(Blend) 操作。这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区中的像素值。但对于半透明物体,我们就需要混合,来让物体看起来透明。
  • 双缓冲
    • 为了避免看到正在进行光栅化的图元,GPU会使用双缓冲的策略。一旦有场景进入了后置缓冲区,那么后置缓冲区就会合前置缓冲区进行交换。从而保证我们看到的图像是连续的。

本文来源《unity shader入门精要》冯乐乐著
做为学习的记录,想学习的可以看这本书


http://chatgpt.dhexx.cn/article/QMnBpAGc.shtml

相关文章

Unity Shader入门精要--第4 章 学习Shader 所需的数学基础:矩阵

Unity系列文章目录 文章目录 Unity系列文章目录前言4.4.3 矩阵运算4.4.4 特殊的矩阵2.单位矩阵 参考 前言 不幸的是,没有人能告诉你母体(matrix)究竟是什么。你需要自己去发现它。 —电影《黑客帝国》(英文名&#xf…

【转】《Unity Shader入门精要》冯乐乐著 书中彩图

为方便个人手机学习时候查阅,从网上转来这些彩图。 如属过当行为,联系本人删除。 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html 转自:http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_image…

【转】《Unity Shader入门精要》冯乐乐 随书彩图

绕了好多圈子终于还是沉下心来好好看这本书了… 以下是原项目GitHub中分享的随书彩图 学习的时候看到色彩丰富的东西会心情更好咯 原项目GitHub链接 前言 第2章 渲染流水线 图2.1 真实生活中的流水线 图2.2 渲染流水线中的三个概念阶段 图2.3 渲染所需的数据&#xff08…

《Unity Shader入门精要》冯乐乐著 书中彩图

为方便个人手机学习时候查阅,从网上转来这些彩图,然后整合所有资料。 如属过当行为,联系本人删除。 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html 前言 第2章 渲染流水线 图2.1 真实生活中的流水线…

冯乐乐之二 shader的数学

冯乐乐目录 第2章渲染流水线介绍 第三章 Unity shader基础 基础shaderLab语言,shader结构,属性properties,主角SubShader,备胎Fallback。 shader三大类型: Unity宠儿表面着色器,聪明boy顶点片元着色器…

各大浏览器清除缓存(cache)详细步骤

1. Firefox 1.1 选择“Options”: 1.2 选择“Advanced”->“Network”->“Cached Web Content”,点击“Clear Now”: 2. Chrome 2.1 选择“Settings”: 2.2 点击页面底部“Show advanced settings”: 2.3 选择…

浏览器如何清除缓存教程

打开浏览器—设置—隐私设置—清除浏览器数据

清除浏览器的缓存

第一种方法 在浏览器界面按F12之后,再选择Network,选中Disable cache, 然后刷新(这里有个玄学的问题就是即使你已经选中了Disable cache, 也需要打开network这个页面再刷新才有效, 亲测有效, 但是我也不知道为什么) 第二种方法 在浏览器界面直接Ctrl Shift R 比较方便,但…

Edge浏览器如何清除缓存

浏览器在使用过程中会产生大量的缓存,Edge浏览器如何清理缓存?下面是Edge浏览器清理缓存的操作步骤。 1.双击Edge图标打开Edge浏览器。 2.单击右Edge浏览器上角的“更多操作”。 3.弹出菜单,选择“设置”。 4.选择单击“选择要清除的内容”…

清除缓存?(浏览器)

清除缓存 清空浏览器历史记录 **浏览器缓存:**浏览器将用户请求过的静态资源,存储到电脑本地磁盘中,当浏览器再次访问时,就可以直接从本地加载,不需要再去服务端请求了。 好处:减少了服务器的负担&#x…

Chrome清理网页缓存

F12 打开开发者工具(或者直接右键→“检查”),此时右键点击“刷新”按钮: 点击“清空缓存并硬性重新加载即可”。

如何查看Chrome浏览器的页面缓存内容【详细教程】

如何查看浏览器页面缓存内容——代码&控制台 知识调用前言引入控制台输入代码查看在控制台application查看 知识调用 文章可能需要用到的知识🔥🔥🔥浏览器缓存有哪些(通用缓存有哪些) 前言引入 浏览器有多种缓存…

【浏览器】浏览器缓存

一 浏览器缓存机制 浏览器在每次发生请求时,先在在浏览器缓存中查找该请求的结果和缓存标识,并且每次收到请求结果均会把请求结果和缓存标识保存在浏览器缓存中。 总体脑图:文中脑图及流程图资源 浏览器缓存策略分类 缓存策略的分类&…

chrome浏览器清除缓存

场景 :更新页面后可在无痕浏览器中看到更新内容,无法直接打开浏览器看更新内容 方法1:使用无痕浏览器 浏览器右上角-打开新的无痕式窗口 方法2:右键打开控制台 - Application - 找到左侧store - clear site data 方法3&#xff1…

清除浏览器缓存(js、css等)

有时候写web项目,改了js或者css文件,但是浏览器就是不刷新,就很头疼o(╥﹏╥)o。那是因为浏览器还有缓存存在的原因,下面来看如何清除缓存。 1.找到目标网页,鼠标右击,点击检查;或者CtrlShifti&…

清除chrome浏览器缓存

之前有写过设置缓存,本文解决清除html缓存,如何才能清除缓存呢?一下是几个清除浏览器缓存的方法: 方法1.chrome浏览器地址:chrome://settings/clearBrowserData; 方法2.如果是开发者的话:重启服务,刷新页…

Chrome浏览器清除页面js文件缓存的方法

Chrome浏览器清除页面js文件缓存 Chrome浏览器清除js缓存方法虽然简单,但有些人还是不太会,有些人会去设置里面清除有时候没有用,这里写一下简单步骤,使用一次以后就会了,而且速度更快 1、打开需清缓存的页面(如&#…

【浅解】浏览器缓存

缓存 为什么有缓存? 缓存在活中其实很常见。往往初次打开一个新的软件或者网页的时候都会相对较慢, 但是再次打开就会快很多, 这就是缓存的功劳。大大提高了效率,也大大提高了用户体验。 什么数据可以缓存? 不能缓存的数据 实时更新替换的数据(例如: 弹幕,留言,评论,经常…

Google Chrome谷歌浏览器清理缓存的常用方法

Google Chrome谷歌浏览器清理缓存的常用方法 方式一:清除缓存快捷键 CtrlShiftDelete 方法二:按F12,按刷新按钮,会显示3个选项,选择清空缓存并硬性重新加载。 额外使用场景说明: 互联网在全球的普及率与日俱增。与此同时&…

浏览器清缓存清缓存

浏览器清缓存&清缓存 区别方法 区别 浏览器清缓存:清除浏览器里浏览或下载的缓存文件。 清理缓存:是系统里面的缓存文件。 方法 一、浏览器清缓存 浏览器设置里面点清除缓存,如chrome: 二、清理缓存 mac电脑的缓存清理 选…