什么是渲染流水线

渲染三大阶段

1.应用阶段:输出图元;2.几何阶段:输出屏幕空间的顶点信息3.光栅化阶段:绘制像素。

五大空间:

模型(局部)空间:建模软件决定的原点

世界空间:scene中的原点,

观察(相机)空间:相机为原点的空间,

裁剪空间:FOV,nearclip,FarClip构成的空间

屏幕空间:二维平面空间,注意左上角还是左下角是原点。

应用阶段

CPU主导,开发者可以完全控制,开发者三个任务1准备场景数据2粗粒度提出3设置渲染状态

重要目标:输出的几何数据,即渲染图元(rendering primitive),不是本书重点,进入下一步几何阶段。

几何阶段

GPU完成,处理渲染图元进行逐个顶点,逐个多边形操作,这里细分成多个流水线,本书重点。

重要任务:顶点转换到屏幕空间,输出二维顶点坐标,深度,着色信息。进入光栅化阶段。

光栅化阶段

GPU完成,处理二维顶点像素,绘制屏幕像素。这里细分成多个流水线,本书重点。

CPUGPU通信:应用阶段

应用阶段的三步骤:1数据加载显存2设置渲染状态3调用DrawCall(重点)

渲染数据物理移动路径:硬盘HDD->内存RAM->显存VRAWM。

设置渲染状态包括:指定顶点着色器,片元着色器,光源属性,混合属性,材质贴图1等。

DrawCall是完成上述工作之后,CPU通知GPU进行渲染的指令。DC会指向本次渲染的图元列表。

GPU流水线两大阶段:几何阶段,光栅化阶段。

几何阶段:顶点着色器,曲面细分着色器,几何着色器,裁剪,屏幕映射

光栅化阶段:三角形设置,三角形遍历,片元着色器,逐个片元操作。(粗体为可编程的)

顶点着色器:顶点空间变化,顶点着色等。

曲面细分着色器:可选项,可以细分图元

几何着色器:可选项,可以逐个图元操作,或者产生更多图元

裁剪:剔除摄像机视野外面的三角面。

屏幕映射:不可编程,将图元的空间坐标转换到屏幕坐标。

三角形设置,三角形遍历:固定函数控制不可编程。

片元着色器:可编程,逐个片元Fragment着色。

逐片元操作:不可编程但是可配置,逐个片元Fragment处理,如修改颜色,深度缓冲,混合等。

下面详解:顶点着色器,裁剪,屏幕映射,三角形设置,三角形遍历,片元着色器,逐片元操作。

顶点着色器Vertex Shader

网格的每个顶点都会调用一次顶点着色器,只能针对单个顶点操作,不可知顶点之间关系,不能创建和销毁顶点。所以速度快。

主要工作:

1坐标变化:移动旋转缩放针对单个顶点,可以实现顶点动画。

2把顶点坐标从模型空间变换到齐次裁剪空间。o.pos = mul(UNITY_MVP,v.position);

然后再对顶点做透视除法,得到归一化设备坐标NDC(Normalized Device Coordinates)

3计算顶点颜色,如光照计算。

裁剪

在NDC的顶点,即所有顶点都在一个单位立方体内,三角面三个点都在立方体外,舍弃,都在立方体内保留。如果一部分在内部一部风在外部,会生成新的顶点,新的三角形,外部那个部分被舍弃。

屏幕映射

将NDC坐标转换到二维的屏幕坐标,可以称之为降维。其中NDC的xy坐标会根据屏幕大小进行缩放,而z坐标会得到保留,光栅化还会使用z(深度)。处理过的xy,和没有处理的z会构成新的坐标系,称为窗口坐标系。

三角形设置

光栅化的第一步,计算三角形边界的函数,为检查像素是否被三角形覆盖做准备。

三角形遍历

逐个检查每个像素是否被三角面覆盖,如果被覆盖,则生成片元Fragment,此过程称为扫描变换(Scan Conversion)。

深度插值在此阶段完成:被三角形覆盖的像素的深度z值会根据三角形三个点的值插值得到。

注意,片元并不是像素,而是在像素位置上的信息集合(包括:屏幕坐标,深度z,之前的几何阶段信息,法线纹理等)。

输出了片元

片元着色器Fragment Shader

和顶点着色器一样重要的阶段,到目前位置还没有得到每个像素颜色,但是我们已经有了每个像素的片元,在此阶段可以对片元数据进行修改。

纹理采样在此阶段完成,在顶点着色器,每个顶点有对应的纹理坐标,经过纹理坐标的插值之后,可以得到每个片元的纹理坐标,但是片元着色器只能处理单个片元,不能将信息发送给临近片元。

逐片元操作Pre-Fragment Operations

这是流水线的最后一步。本阶段不可编程,但是高度可配置。

任务

1.可见性测试:模板测试,深度测试。此处与渲染队列render queue有关。

2.通过可见测试后,进行颜色混合,将片元颜色值和缓冲区颜色值混合。

3.为了提高性能,我们应该尽量在片元着色器之前完成测试,减少在被舍弃片元上浪费的时间。Unity提前深度测试,称为Early-Z技术。

颜色缓冲区

  颜色缓冲区(COLOR_BUFFER)就是帧缓冲区(FRAME_BUFFER),你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示。每一个物体绘制完了在此存放

深度缓冲区

  深度缓冲区(DEPTH_BUFFER)与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确。片元可见性问题算法:画家算法,逆向画家算法,深度缓冲。

GPU则可以根据z值判断是否需要渲染,这就提高了效率,这在图形学中叫做z消隐。

模板缓冲区

  模版缓冲(STENCIL_BUFFER)与深度缓冲大小相同,通过设置模版缓冲每个像素的值,我们可以指定在渲染的时候只渲染某些像素,从而可以达到一些特殊的效果.

图形流水线中有一个叫模板测试的流程,作用就是限制绘制的图元区域,其做法是按照窗口宽高创建一个矩阵,矩阵由0,1组成,其中由1组成的区域代表相匹配的图元需要提交到后续流程进行测试和绘制,而由0组成的区域的片元则直接被丢弃,起到一个筛选作用,而这个0,1数值矩阵所在的显存区域则称为模版缓冲区。

模版测试在shader中很重要的应用就是遮罩mask。

模板筛选像素

几个常见问题

1.OpenGL&DirectX是什么

OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出,欺师灭祖啊。

DirectX(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口,是一种应用程序接口(API)。DirectX已被广泛使用于Microsoft Windows、Microsoft XBOX、Microsoft XBOX 360和Microsoft XBOX ONE电子游戏开发。

2.HLSL&GLSL&CG是什么

以上三位都是着色器语言

OpenGL的GLSL:OpenGL Shading Language。优点跨平台,但是没有着色器编译器,调用显卡驱动完成着色器编译。

所以GLSL依赖于硬件商,而不是操作系统。

DirectX的HLSL:High Level Shading Language。即使使用不同硬件,着色器编译也是一样的,所以XBOX移植到windows非常容易。

NVIDIA的CG:C for Graphic。已经停止支持

显卡驱动:显卡芯片制造商NVIDIA ATI支持。

以上三位都是相对于GPU汇编语言的高级语言,这些语言会被编译成中间语言,中间语言再由显卡驱动翻译成机器语言,GPU就可以理解。

3.DrawCall是什么

DrawCall就是CPU调用GPU的图形泫然接口,CPU往命令缓冲区(队列)队头添加命令,GPU在缓冲区队尾读取执行命令。

GPU渲染很快,渲染200面和2000面速度没啥区别,但是提交1DC和提交10DC时间差就很多,所以许多时候时GPU等待CPU。

减少DC方法是批处理,合并网格,合并材质。

4.固定渲染管线和可编程渲染管线。

固定管线可配置不可编程,可编程管线则可以修改顶点,片元着色器。

终极问题:什么是Shader编程

Shader代码运行在GPU上,对于GPU流水线那些可编程的部分进行控制,依靠着色器控制流水线的渲染细节。

需要注意

Unity shader 不是shader

传统的shader只能是特定类型的,如顶点着色器,片元着色器,Unity shader全部一个脚本搞定。

渲染设置,如开启混合,深度测试,不是着色器要另起脚本,Unity shader全部一个脚本。

传统shader需要很长代码写输入输出,unity 一个声明搞定。

但是Unity的高度密封,但是很多高级内容无法使用,如曲面细分和几何着色器。

冯乐乐之一 图形学基础 Shader入门精要相关推荐

  1. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  2. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...

  3. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  4. Unity Shader入门精要第3 章 Unity Shader 基础

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity Shader 概述 二.使用步骤 1.3.1.2 Unity 中的材质 2.Unity 中的Shader 3.Unity ...

  5. Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...

  6. 真的0数学基础0Shader基础,如何通过<Shader入门精要>入门?一些阅读建议。

    目录 总览 那为什么还是推荐诸位使用该书Shader入门呢? 如果真的数学0基础如何开始阅读呢? 比较粗略的阅读建议. 后续博客or笔记 最后 总览 首先,需要说明的是,<Shader入门精要& ...

  7. Unity Shader入门精要第七章 基础纹理 凹凸映射之在世界空间下计算

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.pandas是什么? 二.使用步骤 2.Unity 中的法线纹理类型 参考 前言 现在,我们来实现第二种方法,即在世界空间下计算光照 ...

  8. Unity Shader入门精要第七章 基础纹理渐变纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.渐变纹理是什么 参考 前言 尽管在一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理 其实可以用于存储任何表 ...

  9. Unity Shader入门精要——第3章 Unity Shader基础

    Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...

  10. unity shader入门精要_Unity Shader 入门(二):shader 基础

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...

最新文章

  1. SICK LMS151-10100使用攻略
  2. x86 下制作 ARM Docker 镜像,Docker Hub、Travis 自动构建 qemu-user-static
  3. TComboBox的使用
  4. [DP] LGTB 玩THD (复杂状态DP)
  5. caffe学习(二):利用mnist数据集训练并进行手写数字识别(windows)
  6. 4、连接Mysql数据库
  7. Linux学习之Vim编辑器
  8. dev中文本框等获取焦点事件
  9. 手把手带你入门Python爬虫(四、ORM与peewee)
  10. kuboard使用mysql_Kuboard Kubernetes安装
  11. Word转换PDF:pdf虚拟打印机怎么用操作技巧详解
  12. 建站系统创业项目综合测评:ePower、云优CMS、微加互联、微企点
  13. ncm在线转换mp3格式
  14. 教你们一招免300元直接认证小程序的办法
  15. 商空间的理解(Quotient space)
  16. ReentrantLock 源码简单分析
  17. composer入门教程
  18. h5海报页面定位中的元素居中
  19. 最佳回归模型选择指标——马洛斯CP值
  20. 图书销售系统(C#界面设计)

热门文章

  1. 基于相对熵优化VMD的非局部均值去噪方法
  2. java实现一码多扫支付_详解JAVA后端实现统一扫码支付:微信篇
  3. pycharm免安装版推荐
  4. sony电视投屏android,Wow,将苹果Macbook投屏到索尼BRAVIA原来是这样玩…教程分享
  5. 支持iphone的打印服务器,MAC苹果电脑系统 如何添加网络打印机(适用于Mac OS)
  6. C语言学习-翁凯(目录总章)
  7. 关于力学环境中振动试验的知识
  8. IDEA打包jar包的多种方式
  9. 高斯消元法python编程_割圆术计算圆周率与矩阵高斯消元法(Python)
  10. 智能家居无线系统为代表的Zigbee和Z-Wave协议的介绍,有线和无线的各自优势?