《Unity Shader入门精要》第一章

目录

一、书籍分类和全书重点(尽量简化)

  1.书籍分类

  2.全书重点

二、第二章 渲染流水线

  1.本章重点(尽量简化)

  2.章节联系

    2.1 二之一

    2.2 二之三

    2.3 二之四

三、本章详解

  1 综述

    1.1 应用阶段

    1.2 几何阶段

    1.3 光栅化阶段

  2 CPU和GPU之间的通信

  3 GPU流水线

四、问题

  1.什么是OpenGL和DirectX?

  2. 什么是HLSL、GLSL、CG?

  3. 什么是 Draw Call,为什么 Draw Call多了会影响帧率?

  4. 如何减少 Draw Call?

五、思维导图


一、书籍分类和全书重点(尽量简化)

  1.书籍分类

        实用文,学习Unity Shader基础。

  2.全书重点

        从基础开始,逐渐了解并掌握如何编写Unity Shader。并且建立对渲染流程的基本认识,学习Unity 中的一些渲染机制以及如何使用 Unity Shader实现各种自定义的渲染效果。

二、第二章 渲染流水线

  1.本章重点(尽量简化)

        第二章讲授GPU怎么渲染流水线的。

  2.章节联系

    2.1 二之一

        第一章就是聊聊天,介绍了一下书籍结构。

    2.2 二之三

        第三章讲的是Unity Shader实现原理和基本语法。

    2.3 二之四

        第四章讲的是学籍Shader所需的数学基础。

三、本章详解

  1 综述

        Shader是着色器,与之关系非常紧密的是渲染流水线

        流水线就是将需求分步骤进行,然后间距一个或多个步骤进行操作,让每一步间隔开来,每一个时间同时做多个步骤,会让速度大幅度提升。

        渲染流水线的工作目的:由一个三维场景出发、生成(渲染)一张二维图像到屏幕上

        渲染流程分为三个阶段:应用阶段-几何阶段-光栅化阶段

    1.1 应用阶段

        CPU负责,主要任务:准备好场景数据,例如摄像机位置,场景包含那些模型等;粗粒度剔除(culling)工作,将不可见的物体剔除除去;设置好每个模型的渲染状态,例如使用的纹理,材质等;输出的是渲染图元,渲染所需的几何信息。

    1.2 几何阶段

        GPU上运行,主要任务:对每一个渲染图元进行逐顶点、逐多边形的操作;将顶点坐标变换到屏幕空间;输出的是屏幕空间的而为顶点坐标、深度值等。

    1.3 光栅化阶段

        GPU上运行,主要任务:将上一个阶段传递过来的数据产生屏幕上的图像,渲染出最终图像

  2 CPU和GPU之间的通信

        渲染流水线的起点是CPU,就是应用阶段。分为三个阶段:将数据加载到显存中;设置渲染状态;调用Draw Call。

        把数据加载到显存中:所有渲染所需的数据都需要从硬盘加载到系统内存中,然后网格和纹理等数据加载到显卡上的存储空间——显存(感觉像显卡的Cache)。

        设置渲染状态:渲染状态就是定义场景中网格是怎么样被渲染的。例如顶点着色器(Vertex Shader)/片元着色器(Fragment Shader)、光源属性、材质等。

        调用Draw Call:CPU发起到GPU接收,命令指向需要被渲染的图元(primitives)列表,之后就让GPU渲染这些图元。

  3 GPU流水线

渲染流水线

        顶点着色器:逐顶点光照和坐标变换(转换为齐次裁剪坐标系)。输出后续所需的数据。

        裁剪:不在摄像机视野范围内的不需要被处理。

        屏幕映射:把每个图元的x和y坐标转换到屏幕坐标系。就是在1*1的坐标系的点变换为你屏幕的1920*1080的点上。

        三角形设置:计算每个图元覆盖了那些像素,以及计算其颜色。

        三角形遍历:检查每一个像素是否被三角形所覆盖(覆盖的就是片元)。找到这些片元。并且使用这三个顶点信息对覆盖区域进行插值(深度)。输出带有数据的片元序列。

三角形遍历

        片元着色器:根据上一阶段的插值结果,输出片元的颜色。

片元着色器 

        逐片元操作:决定每片片元的可见性(深度、模板测试等),通过测试后就和已经存储在颜色缓冲区的颜色进行合并(屏幕不是突然就变颜色的,会有个缓冲,就是颜色合并;缓冲区就是计算机提前计算好下一帧的显示画面在缓存区里,就可以直接替换屏幕画面)。

四、问题

  1.什么是OpenGL和DirectX?

        OpenGL和DirectX是图像编程接口,是各种寄存器、显存等硬件的一层抽象。就是让我们编程能让计算机听懂并执行的桥梁。

CPU、OpenGL/DirectX、显卡驱动和GPU之间的关系

  2. 什么是HLSL、GLSL、CG?

        着色器语言。HLSL是DirectX的、GLSL是OpenGL的、NVIDIA是CG。这些语言会编译成中间语言IL,之后交给显卡驱动翻译成机器语言(有点类似CLR)。

  3. 什么是 Draw Call,为什么 Draw Call多了会影响帧率?

        Draw Call就是CPU调用图形编程接口,叫显卡干活了。CPU到GPU整了个命令缓冲器,为了让GPU渲染之后干下一个活(没干完活你就叫他渲染其他的,就会发生有部分渲染不到的屏幕),CPU添加命令,GPU读取,两者不冲突。

命令缓冲区 

        GPU一般渲染速度会大于CPU提交命令的速度,如果一个个提交DrawCall的话,GPU就会渲染一下,然后就睡觉等你继续提交。为了不让GPU睡觉,就让CPU一次提交批处理过的Draw Call(就类似复制一百个1kb文件是比复制100kb文件慢)。

  4. 如何减少 Draw Call?

        对Draw Call进行批处理。将很多小的Draw Call合并成大的Draw Call。但是合并也要耗费性能,所以尽量对静态物体进行批处理,就可以减少合并次数,动态的批处理就要每次重新合并。(类似背包系统就要用到批处理Draw Call)

五、思维导图

猜你喜欢

转载自blog.csdn.net/weixin_51374560/article/details/128792397