• 《UnityShader 入门精要》 笔记01


    第二章 渲染流水线

    2.1 综述

    2.1.1 什么是流水线

    所有步骤并行

    2.1.2 什么是渲染流水线

    由一个三维场景触发、生成(渲染)一张二维图像

    应用阶段 --(输出渲染图元)->几何阶段–(输出屏幕空间的顶点信息)->光栅化阶段
    CPU -> GPU -> GPU

    • 应用阶段 CPU
      由开发者主导,输出渲染图元 ---- 点、线、三角面等
    • 几何阶段 GPU
      确定要绘制的图元 怎么绘制 在哪绘制
      把顶点坐标变换到屏幕坐标
    • 光栅化阶段 GPU
      使用屏幕上的像素,渲染出最终的图像

    2.2 CPU和GPU之间的通信

    2.2.1 把数据加载到显存中

    硬盘(HDD) – CPU – 系统内存(RAM) – GPU – 显存(VRAM)

    2.2.2 设置渲染状态

    设置使用哪个顶点着色器 片元着色器 光源属性 材质来去渲染

    2.2.3 调用DrawCall

    DrawCall是由CPU发给GPU的一个命令
    CPU通过DrawCall来告诉GPU开始进行一个渲染过程,一个DrawCall会指向本次调用需要渲染的图元列表

    2.3 GPU流水线

    2.3.1 概述

    对于几何阶段和光栅化阶段 开发者无法拥有绝对的控制权 但是GPU向开发者开放了很多的控制权

    几何阶段:

    1、顶点着色器 (可编程的 必实现) 实现顶点的空间变换,顶点着色等功能
    2、曲面细分着色器 (可选) 细分图元
    3、几何着色器 (可选) 执行逐图元的着色操作,或者被用于生产更多的图元
    4、裁剪 (可配置 不可编程) 将不在视野内的图元裁剪掉,剔除某些图元的面片
    5、屏幕映射 (不可配置 不可编程) 把每个图元的坐标转换到屏幕坐标系中

    光栅化概念阶段:

    1、三角形设置 (不可配置 不可编程) 固定函数阶段
    2、三角形遍历 (不可配置 不可编程) 固定函数阶段
    3、片元着色器 (可编程) 实现逐片元的着色操作
    4、逐片元操作 (不可编程 可配置) 修改颜色、深度缓冲、进行混合

    2.3.2 顶点着色器

    输入来自于CPU 处理单位是顶点 -->输入进来的每个顶点都会调用一次顶点着色器
    主要工作:坐标变换(把顶点坐标从模型空间转换到齐次裁剪空间)和逐顶点光照

    2.3.3 裁剪

    不在视野范围的物体不需要被处理。

    图元和摄像机的关系:
    1、完全在视野内:传递给下一流水线阶段
    2、完全在视野外:不向下传递
    3、部分在视野内:裁剪 在这个图元与视野边界处建立新的顶点代替(新的顶点生成 外部顶点舍弃)

    2.3.4 屏幕映射

    输入为三维坐标系下的坐标
    任务是把每个图元的x和y转换到屏幕坐标系 是一个缩放的过程
    屏幕映射不会对输入的z进行处理 屏幕坐标和z坐标一起构成了窗口坐标系

    OpenGL 左下角为0,0
    DirectX 左上角为0,0

    2.3.5 三角形设置

    计算每个图元覆盖了那些像素 为这些像素计算他们的颜色

    2.3.6 三角形遍历(扫描变换)

    根据上一阶段来判断三角网格覆盖了哪些像素,并使用三个顶点信息对整个覆盖区域的像素进行插值,如果被覆盖则生成一个片元,最后输出一个片元序列
    (一个片元不是真正意义上的像素,而是包含了很多状态的几何,用于计算每个像素的最终颜色)

    2.3.7 片元着色器

    根据数据插值输出一个或者多个颜色值

    2.3.8 逐片元操作(输出合并阶段)

    决定可见性:
    通过模板测试和深度测试来确定是否舍弃片元

    混合:
    对于半透明物体 需要混合来让物体看是透明的

    双重缓冲:后置缓冲 前置缓冲
    一旦场景被渲染到了后置缓冲中 GPU就会交换后置缓冲和前置缓冲(之前显示在屏幕上的图像) 保证我们看到的图像信息总是连续的

    2.4 一些容易困惑的地方

    2.4.1 什么是OpenGL/DirectX

    由于开发者想访问GPU是一件非常麻烦的事情,OpenGL/DirectX作为图像应用编程接口,在这些硬件的基础上实现了一层抽象,可用来渲染二维或者三维图形。可以说这些借口架起了上层应用程序和底层GPU的沟通桥梁。

    2.4.2 什么是HLSL/GLSL/CG

    这些都是高级着色器语言
    DirectX的HLSL(High Level Shading Language)
    OpenGL的GLSL(OpenGL Shading Language)
    NVIDIA的CG(C for Graphic)
    这些语言会被编译成中间语言,再交给显卡驱动翻译成GPU可以理解的机器语言

    2.4.3 什么是Draw Call

    CPU调用图像编程接口 如OpenGL的glDrawElements命令或者DirectX中的DrawIndexedPrimitive命令,以命令GPU进行渲染操作

    CPU和GPU并行操作试用命令缓冲区。CPU添加命令 GPU执行

    CPU需要完成很多前置工作才能提交一个Draw Call命令 但是GPU渲染能力很强,可以做的很快。如果CPU把大量时间用在提交Draw Call上 则会造成CPU的过载。
    批处理思想:把很多小的DrawCall合并成一个大的DrawCall

    在游戏开发中,为了减少Draw Call的开销 有两点需要注意
    1、避免使用大量小网格,当不可避免时考虑是否可以合并
    2、避免使用过多的材质,尽量在不同网格之间共用一个材质

    2.4.4 什么是固定管线渲染

    没有对流水线阶段的完全控制权,只是给开发者提供一些配置操作

    2.5 那么,你明白什么是Shader了吗

    Shader就是:
    1、GPU流水线上一些可高端变成的阶段
    2、有一些特定类型的着色器(顶点着色器、片元着色器)
    3、控制流水线中的渲染细节

  • 相关阅读:
    动态类型语言和静态类型语言的区别
    CMMI/ASPICE认证咨询及工具服务
    C#根据任意不重复的数组产生一个连续的新数组且最短,其中新数组最大数和者最大数+1不在该任意数组中
    java-php-net-python-在线音乐播放网站.计算机毕业设计程序
    JS语法杂记
    seaborn学习笔记(四):箱型图、小提琴图
    Redis与分布式:主从复制
    【Vue3 源码解析】to 系列全家桶
    2024级199管理类联考之数学基础(上篇)
    C++ 练气期之函数探幽
  • 原文地址:https://blog.csdn.net/Retrovich/article/details/133089963