1. Shader运行于GPU上。
  2. Shader的类型主要有:顶点着色器(Vertex Shader)、细分曲面着色器(Tessellation Shader)、几何着色器(Geometry Shader)、像素着色器(Pixel Shader)、Computer Shader。
    
     
  • 顶点着色器(Vertex Shader):流水线的第一个阶段,它的输入来自于CPU.
  1. 顶点着色器的处理单位是顶点,也就说输入进来的每个顶点都会调用一次顶点着色器。
  2. 顶点着色器本身不会创建或者销毁任何顶点,而且无法得到顶点与顶点之间的关系。但正是因为这样的相互独立性,GPU可以利用本身的特性并行化处理每一个顶点。这意味着这一阶段的处理速度会很快。
  3. 顶点着色器的基本功能就是坐标变换与逐顶点光照。即把模型的顶点坐标从模型空间转换到齐次剪裁空间中(o.pos=mul(UNITY_MVP,v.position);),同时还可以计算和输出顶点的颜色。
  • 细分曲面着色器(Tessellation Shader):可选的着色器
  1. 细分曲面着色器(Tessellation Shader)可以使用一个新的几何图元类型,称为patch(斑点、碎片),来生成一个三角形网格。
  2. 细分曲面着色器(Tessellation Shader)分为细分曲面控制着色器(Hull Shader)与细分曲面计算着色器(Domain Shader)。
    1. Hull Shader对patch顶点进行操作,并指定从patch中应该生成多少几何图形。
    2. Domain Shader使用细分曲面坐标来放置所生成的顶点,并且将它们发送到光栅化器,或发送到几何着色器做进一步处理。
  • 几何着色器(Geometry Shader):可选的着色器
  1. 可以被用于执行逐图元(Per-Primitive)的着色操作或者用于产生更多的图元。
  2. 几何着色器在启用后,它将从顶点着色器获得一个基础图元作为输入的基本图形类型,通过对输入的顶点进行处理,几何着色器将决定输出的图元类型和个数。当输出的图元减少或者不输出时,实际上起到了裁剪图形的作用,当输出的图元类型改变或者输出更多图元时起到了产生和改变图元的作用。
  3. 几何着色器有意思的地方在于它可以把(一个或多个)顶点转变为完全不同的基本图形(primitive),从而生成比原来多得多的顶点。
  • 裁剪(我的理解:这一步包括图元装配):
  1. 图元装配,即将顶点根据primitive(原始的连接关系)还原成网格结构。网格由顶点和索引组成,在之前流水线中是对顶点的处理,在这个阶段是根据索引将顶点连接在一起,组成线、面单元。之后就是对超出屏幕外的三角形进行裁剪。
  2. 这一步是不可编程的,即我们无法通过编程来控制裁剪的过程,而是硬件上的固定操作,但我们可以自定义一个裁剪操作来对这一步进行配置。
  3. 一个图元和摄像机视野的关系有三种:完全在视野内、部分在视野内、完全在视野外。完全在视野内的图元会继续传递给下一个流水线阶段;完全在是野外的图元不会继续向下传递,因为他们不需要被渲染;部分在视野内的图元就需要裁剪。
  4. 裁剪时,新的顶点会被生成,在视野外的顶点会被舍弃。
    

  • 屏幕映射
  1. 这一步输入的坐标仍然是三维坐标系下的坐标(范围在单位立方体内)。
  2. 屏幕映射的任务就是把每个图元的x和y坐标转换到屏幕坐标系下。
  3. 屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。
  4. OpenGL屏幕左下角为(0,0)点;DirectX屏幕左上角为(0,0)点。
  5. 将屏幕坐标系下的顶点位置以及和它们相关的额外信息,如深度值(z坐标)、法线方向、视觉方向等输出到下一阶段。
  • 三角形设置:进入光栅化阶段
  1. 输入上一阶段输出的三角形网格的顶点。
  2. 计算光栅化一个三角网格所需要的信息。
  • 三角形遍历,也称扫描变换
  1. 检查每个像素是否被一个三角网格所覆盖。如果被覆盖,就会生成一个片元。
  2. 一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包含了(但不限于)它的屏幕坐标、深度信息,以及其他从几何阶段出输出的顶点信息,例如法线、纹理坐标等。
    
        三个顶点的深度进行插值得到其重心位置对应的片元的深度值为-10.0
  • 片元着色器(Fragment Shader)、(Pixel Shader,像素着色器)
  1. 完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。
  2. 为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,经过上述一系列过程得到其覆盖的片元的纹理坐标。
  3. 局限在于:仅可以影响单个片元,不可以将自己的任何结果直接发送给它的邻居们。(有一情况例外,片元着色器可以访问到导数信息)
    
           根据上一步插值后的片元信息,片元着色器计算该片元的输出颜色

  • 逐片元操作,或者称输出合并阶段:渲染流水线的最后一步。该阶段是高度可配置的。
  1. 决定每一个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。
  2. 如果一个片元通过了所有的测试,那么把该片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者是混合。
  3. 只有通过了所有的测试后,新生成的片元才能和颜色缓冲区中已经存在的像素颜色进行混合,最后再写入颜色缓冲区中。
    1. 模板测试:用于限制渲染的区域,另外,还有更高级的用法:渲染阴影、轮廓渲染等。不管一个片元有没有通过模板测试,我们都可以根据模板测试和下面的深度测试结果来修改模板缓冲区。
    2. 深度测试:离摄像机距离的一个测试。如果一个片元没有通过深度测试,它就没有权利更改深度缓冲区中的值。而如果通过了测试,我们还可以指定是否要用这个片元的深度值覆盖原有的深度值。
    3. 混合:对于不透明物体,开发者可以关闭混合操作,这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区中的像素值。对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的。
    
    
    
  • 屏幕图像:双重缓冲策略
  1. 后置缓冲区:场景的渲染是在幕后发生的,即在后置缓冲区中。
  2. 前置缓冲区:之前显示在屏幕上的图像。

Shader|GPU流水线_该用户还没想到昵称_新浪博客相关推荐

  1. Shader|OpenGL与DirectX_该用户还没想到昵称_新浪博客

      OpenGL和DirectX都是图像应用编程接口,这些接口用于渲染二维或三维图形.可以说,这些接口架起了上层应用程序与底层GPU的沟通桥梁.     一个应用程序向这些接口发送渲染命令,而这些接口 ...

  2. Java之蓝牙传送数据byte与String转换_该用户还没想到昵称_新浪博客

        最近开发人脸识别项目,因为谷歌眼镜太不给力了,调用摄像头不到半小时就会发热卡顿,所以捕捉人脸并识别的功能就不能依赖谷歌眼镜了,只能将其捕获的人脸图片通过蓝牙传给手机,在手机上进行识别后,再将信 ...

  3. C#复习(十五)事件一_该用户还没想到昵称_新浪博客

    事件基于委托存在,事件是类的成员 事件不能在类外调用,虽然我们可以在类中声明事件为public,但实际编译代码时永远都是private,并且是private的委托(事件的本质就是委托) 定义事件处理方 ...

  4. 普度网络营销策划_普度网络营销策划-齐宁_新浪博客

    标签: 杂谈 自媒体的盛行,让我们知道了文案的重要性.一条好的文案,可以让你的广告如虎添翼.一篇好的内容可以瞬间刷爆朋友圈.今天我要总结的就是如何做一个打动人内心心智的好文案. 文案最主要的目的是让消 ...

  5. cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客

    cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...

  6. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客

    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客 Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf     (2009-07- ...

  7. [转载]如何让上传到新浪博客和相册中的照片更大更清晰_我是亲民_新浪博客

    原文地址:如何让上传到新浪博客和相册中的照片更大更清晰作者:李永宏 如何让上传到新浪博客和相册中的照片更大更清晰 图.文 李永宏 以前有朋友问我,怎么你上传到博客里的照片看起来不是很清晰,你用什么相机 ...

  8. [转载]环游澳大利亚18天——前传与攻略_我是亲民_新浪博客

    期待中,学习中... 原文地址:环游澳大利亚18天--前传与攻略作者:老湖 我一直以为自助旅行首先要走遍中国最美的地方,趁着年轻,徒步旅行中国最艰苦的美丽之地,老了之后,再去国外旅行,国外旅行先去比较 ...

  9. 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客

    邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客 邓文迪撑杆跳,甩开老公要独立? (2010-01-11 10:55:22) 转载▼

最新文章

  1. .NET托管内存类应用的内存泄漏分析和诊断
  2. java ip调天气预报接口_JAVA + WeatherWebService 实现天气预报接口调取
  3. 对于整数数组类的算法的终极解决方案
  4. Struts2 过滤器与拦截器
  5. Android安全开发之WebView中的地雷
  6. YUV格式文件转RGB格式
  7. java 1.7 环境变量_安装JDK1.8之后又安装1.7出现的环境变量问题
  8. 程序员眼中的统计学(3)】概率计算:把握机会
  9. 对极大似然估计的理解
  10. java ssh 项目心得_ssh实训总结(共10篇).docx
  11. 草图大师:SketchUp 2019 for Mac
  12. 如何修改图像尺寸?教你两招轻松修改图像宽高像素
  13. Q1财报蛋壳公寓再亏损:盈利死穴如何破?
  14. 初识Cpp之 三、Cpp预处理器
  15. 《视觉slam十四讲》第3讲课后习题
  16. IOS 视频直播常用集成
  17. cnpm 新版本替换,及randomUUID is not a function问题解决
  18. 百度天气API 获取天气
  19. Java modifier
  20. ini 文件 使用说明

热门文章

  1. DirectX修复教程
  2. 数字旋转方阵问题-分治法
  3. 【工作心得】部分工作总结
  4. (转)如何看主板供电
  5. [Python] 字典操作近两万字大总结(超详细教程)
  6. 草莓perl(v5.32.1)环境安装指南
  7. 国内行业垂直型SaaS公司有哪些?发展前景如何?
  8. 安卓游戏录屏v2.5.4会员版
  9. C语言探索之旅 | 第二部分第六课:创建你自己的变量类型
  10. 对接顺丰丰桥系统注意事项