冯乐乐之一 图形学基础 Shader入门精要
什么是渲染流水线
渲染三大阶段
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入门精要相关推荐
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- Unity Shader入门精要学习笔记 - 第7章 基础纹理
转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
- Unity Shader入门精要第3 章 Unity Shader 基础
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity Shader 概述 二.使用步骤 1.3.1.2 Unity 中的材质 2.Unity 中的Shader 3.Unity ...
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.实践 参考 前言 遮罩纹理(mask texture)是本章要介绍的最后一种纹理,它非常有用,在很多商业游戏中 都可以见到它的身影. ...
- 真的0数学基础0Shader基础,如何通过<Shader入门精要>入门?一些阅读建议。
目录 总览 那为什么还是推荐诸位使用该书Shader入门呢? 如果真的数学0基础如何开始阅读呢? 比较粗略的阅读建议. 后续博客or笔记 最后 总览 首先,需要说明的是,<Shader入门精要& ...
- Unity Shader入门精要第七章 基础纹理 凹凸映射之在世界空间下计算
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.pandas是什么? 二.使用步骤 2.Unity 中的法线纹理类型 参考 前言 现在,我们来实现第二种方法,即在世界空间下计算光照 ...
- Unity Shader入门精要第七章 基础纹理渐变纹理
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.渐变纹理是什么 参考 前言 尽管在一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理 其实可以用于存储任何表 ...
- Unity Shader入门精要——第3章 Unity Shader基础
Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...
- unity shader入门精要_Unity Shader 入门(二):shader 基础
一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...
最新文章
- SICK LMS151-10100使用攻略
- x86 下制作 ARM Docker 镜像,Docker Hub、Travis 自动构建 qemu-user-static
- TComboBox的使用
- [DP] LGTB 玩THD (复杂状态DP)
- caffe学习(二):利用mnist数据集训练并进行手写数字识别(windows)
- 4、连接Mysql数据库
- Linux学习之Vim编辑器
- dev中文本框等获取焦点事件
- 手把手带你入门Python爬虫(四、ORM与peewee)
- kuboard使用mysql_Kuboard Kubernetes安装
- Word转换PDF:pdf虚拟打印机怎么用操作技巧详解
- 建站系统创业项目综合测评:ePower、云优CMS、微加互联、微企点
- ncm在线转换mp3格式
- 教你们一招免300元直接认证小程序的办法
- 商空间的理解(Quotient space)
- ReentrantLock 源码简单分析
- composer入门教程
- h5海报页面定位中的元素居中
- 最佳回归模型选择指标——马洛斯CP值
- 图书销售系统(C#界面设计)
热门文章
- 基于相对熵优化VMD的非局部均值去噪方法
- java实现一码多扫支付_详解JAVA后端实现统一扫码支付:微信篇
- pycharm免安装版推荐
- sony电视投屏android,Wow,将苹果Macbook投屏到索尼BRAVIA原来是这样玩…教程分享
- 支持iphone的打印服务器,MAC苹果电脑系统 如何添加网络打印机(适用于Mac OS)
- C语言学习-翁凯(目录总章)
- 关于力学环境中振动试验的知识
- IDEA打包jar包的多种方式
- 高斯消元法python编程_割圆术计算圆周率与矩阵高斯消元法(Python)
- 智能家居无线系统为代表的Zigbee和Z-Wave协议的介绍,有线和无线的各自优势?