3D图形学(2):GPU渲染管线与可编程着色器_gpu渲染管线与着色器-程序员宅基地

技术标签: 3D图形学基础  《Real-Time Rendering》  游戏开发  real-time rendering  

内容引自《Real Time Rendering 3rd》

渲染管线流程图

其中:

  • 绿色的阶段都是完全可编程。
  • 黄色的阶段可配置,但不编程。
  • 蓝色的阶段完全固定。

 

顶点着色器 Vertext Shader

 

  • 顶点着色器(The Vertex Shader)的功能于2001年首次在DirectX 8中引入。由于它是流水线上的第一个阶段,可选是在GPU还是CPU上实现。而在CPU上实现的话,需将CPU中的输出数据发送到GPU进行光栅化。目前几乎所有的GPU都支持顶点着色。
  • 顶点着色器是完全可编程的阶段,是专门处理传入的顶点信息的着色器,顶点着色器可以对每个顶点进行诸如变换和变形在内的很多操作。顶点着色器一般不处理附加信息,也就是说,顶点着色器提供了修改,创建,或者忽略与每个多边形顶点相关的值的方式,例如其颜色,法线,纹理坐标和位置。通常,顶点着色器程序将顶点从模型空间(Model Space)变换到齐次裁剪空间(Homogeneous Clip Space),并且,一个顶点着色器至少且必须输出此变换位置。
  • 值得注意的是,在这个顶点着色阶段之前发生了一些数据操作。比如在DirectX中叫做输入装配(Input Assembler)的阶段,会将一些数据流组织在一起,以形成顶点和基元的集合,发送到管线。
  • 传入的每个顶点由顶点着色器程序处理,然后输出一些在三角形或直线上进行插值后获得的值。顶点着色器既不能创建也不能消除顶点,并且由一个顶点生成的结果不能传递到另一个顶点。由于每个顶点都被独立处理,所以GPU上的任何数量的着色器处理器都可以并行地应用到传入的顶点流上。
  • 顶点着色器的输出可以以许多不同的方式来使用,通常是随后用于每个实例三角形的生成和光栅化,然后各个像素片段被发送到像素着色器,以便继续处理。而在Shader Model 4.0中,数据也可以发送到几何着色器(Geometry Shader)或输出流(Streamed Output)或同时发动到像素着色器和几何着色器两者中。

几何着色器 The Geometry Shader
 

  • 几何着色器(Geometry Shader)是顶点和片段着色器之间一个可选的着色器,随着2006年底 DirectX10的发布被加入到硬件加速图形管线中。几何着色器作为Shader Model 4.0的一部分,不能早期着色模型(<=SM 3.0)中使用。
  • 几何着色器的输入是单个对象及对象相关的顶点,而对象通常是网格中的三角形,线段或简单的点。另外,扩展的图元可以由几何着色器定义和处理。
  • 几何着色器可以改变新传递进来的图元的拓扑结构,且几何着色器可以接收任何拓扑类型的图元,但是只能输出点、折线(line strip)和三角形条(triangle strips)。
  • 几何着色器需要图元作为输入,在处理过程中他可以将这个图元整个丢弃或者输出一个或更多的图元(也就是说它可以产生比它得到的更多或更少的顶点)。这个能力被叫做几何增长(growing geometry)。如上所述,几何着色器输出的形式只能是点,折线和三角形条。
  • 当我们未添加几何着色器时,默认的行为是将输入的三角形直接输出。我们添加了几何着色器之后,可以在几何着色器中修改输出的图形,我们可以输出我们想要输出的任何图形。

流输出 Stream Output

       GPU的管线的标准使用方式是发送数据到顶点着色器,然后对所得到的三角形进行光栅化处理,并在像素着色器中处理它们。 数据总是通过管线传递,无法访问中间结果。流输出的想法在Shader Model 4.0中被引入。在顶点着色器(以及可选的几何着色器中)处理顶点之后,除了将数据发送到光栅化阶段之外,也可以输出到流,也就是一个有序数组中进行处理。事实上,可以完全关掉光栅化,然后管线纯粹作为非图形流处理器来使用。以这种方式处理的数据可以通过管线回传,从而允许迭代处理。这种操作特别适用于模拟流动的水或其他粒子特效。

像素着色器 Pixel Shader
 

  • 像素着色器(Pixel Shader,Direct3D中的叫法),常常又称为片元着色器(Fragment Shader, OpenGL中的叫法),用于进行逐像素计算颜色的操作,让复杂的着色方程在每一个像素上执行。如图GPU渲染管线所示,像素着色器是光栅化阶段的主要步骤之一。在顶点和几何着色器执行完其操作之后,图元会被裁剪、屏幕映射,结束几何阶段,到达光栅化阶段,在光栅化阶段中先经历三角形设定和三角形遍历,之后来到像素着色阶段。
  • 像素着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。名称片断着色器似乎更为准确,因为对于着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
  • 需要注意,像素着色程序通常在最终合并阶段设置片段颜色以进行合并,深度值也可以由像素着色器修改。模板缓冲( stencil buffer )值是不可修改的,而是将其传递到合并阶段(merge stage)。在SM 2.0以及以上版本,像素着色器也可以丢弃(discard )传入的片段数据,即不产生输出。这样的操作会消耗性能,因为通常在这种情况下不能使用由GPU执行的优化 。诸如雾计算和alpha测试的操作已经从合并操作转移到SM 4.0 中的像素着色器里计算。
  • 可以发现,顶点着色程序的输出,在经历裁剪、屏幕映射、三角形设定、三角形遍历后,实际上变成了像素着色程序的输入。在Shader Model 4.0中,共有16个向量(每个向量含4个值)可以从顶点着色器传到像素着色器。当使用几何着色器时,可以输出32个向量到像素着色器中。像素着色器的追加输入是在Shader Model 3.0中引入的。例如,三角形的哪一面是可见的是通过输入标志来加入的。这个值对于在单个通道中的正面和背面渲染不同材质十分重要。而且像素着色器也可以获得片段的屏幕位置。

合并阶段 The Merging Stage
 

  • 作为光栅化阶段名义上的最后一个阶段,合并阶段(The Merging Stage)是将像素着色器中生成的各个片段的深度和颜色与帧缓冲结合在一起的地方。这个阶段也就是进行模板缓冲(Stencil-Buffer)和Z缓冲(Z-buffer)操作的地方。最常用于透明处理(Transparency)和合成操作(Compositing)的颜色混合(Color Blending)操作也是在这个阶段进行的。
  • 虽然合并阶段不可编程,但却是高度可配置的。在合并阶段可以设置颜色混合来执行大量不同的操作。最常见的是涉及颜色和Alpha值的乘法,加法,和减法的组合。其他操作也是可能的,比如最大值,最小值以及按位逻辑运算。

总结

GPU渲染管线的一个流程概览:

  • 顶点着色器( The Vertex Shader )是完全可编程的阶段,顶点着色器以对每个进行诸如变换和变形在内的很多操作,提供了修改 /创建 /忽略顶点相关属性的功能,这些包括颜色、 法线、纹理坐标和位置。顶点着色器的必须完成任务是将从模型空间转换到齐次裁剪空间。
  • 几何着色器( The Geometry Shader )位于顶点着色器之后,允许 GPU 高效地创建和销毁几何图元。几何着色器是可选的,是完全可编程阶段,主要对图元(点、线、三角形)的顶点进行操作。几何着色器接收顶点着色器的输出作为输入,通过高效几何运算,将数据输出,随后经过几何阶段和光栅化阶段的其他处理后,会发送给片元着色器。
  • 裁剪( Clipping)属于可配置的功能阶段,在此阶段可选运行裁剪方式,以及添加自定义裁剪面。
  • 屏幕映射( Screen Mapping )、三角形设置( Triangle Setup )和三角形遍历( Triangle Traversal  )阶段是固定功能阶段。
  • 像素着色器( Pixel Shader,Direct3D 中的叫法)常又称为片元着色器 ( Fragment Shader ,OpenGL 中的叫法 ),是完全可编程的阶段,主要作用进行像素处理,逐像素处理像素颜色。
  • 合并阶段( The Merger Stage)处于完全可编程和固定功能之间,尽管不能编程,但是高度可配置,以进行一系列的操作。其除了合并操作,还分管颜色修改( Color Modifying ), Z缓冲( Z-buffer ),混合( Blend ),模板( Stencil )和相关缓存的处理。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq826364410/article/details/88389349

智能推荐

git编译报错解决-程序员宅基地

文章浏览阅读939次。git configure 配置时没有设定--with-curl --with-expat 造成首先确定是否安装curl包:rpm-qa|grepcurl如果没有安装,一定要安装:yuminstall-ycurlcurl-devel安装完成后,删除原安装目录和编译目录,重新解压缩:tar-zxfgit-2.9.2.tar.gz-C/tmp/cd/..._--with-curl失败

Johnson算法:多源最短路算法-程序员宅基地

文章浏览阅读304次。Johnson算法请不要轻易点击标题一个可以在有负边的图上使用的多源最短路算法时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\)空间复杂度\(O(n+m)\)这个神奇的算法综合利用了Dijkstra算法和Bellman-Ford算法(不要慌,虽然有负边但Dijkstra可以跑!)在开始讲解之前,我们将其与floyd进行比较\(flo..._多源最短路的最优复杂度

JTopo + Vue 实现自定义拖拽流程图_vue拖拽流程图-程序员宅基地

文章浏览阅读8.2k次,点赞32次,收藏42次。JTopo + Vue 实现自定义拖拽流程图 市场上做流程图的插件比较多,这里介绍一种基于canvas编写的js插件,结合vue框架做出精美的流程图 首先搭建vue框架,这里就不做介绍,由于jtopo官方demo里用到了jquery,所以我的项目里也引用了jquery插件,鉴于这里用到了很多的dom操作,所以建议大家也直接引用jquery进行操作; 然后将jtopo.js下载到本地,放到自己的vue项目的静态文件目录下,如下图: ![vue引入jtopo.js](https://im_vue拖拽流程图

C语言 实现字符串的复制 char * str_copy_char copy-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏7次。编写一个函数,实现字符串的复制,函数首部定义为:char*str_copy(char*d,char*s)函数功能为:将第二个参数s所表示的字符串复制到第一个参数d所表示的字符串中,函数返回值为第一个参数的值。请写出完整的函数,并写出主函数,对该函数进行验证。说明:本题不允许使用string.h中的标准函数,不允许改变函数首部char * str_copy1(char *d, char *s);char * str_copy2..._char copy

webgl 学习心得_webgl心得体会-程序员宅基地

文章浏览阅读1.2k次。我本是搞Android 的,公司需要就搞3D展示了,刚开始找了很多资料,觉得threejs最为适合我,原因是我会点前端的东西,threejs也比较简单,demo也齐全;但是,由于公司没有真正的UI,全凭老板一句话,你们懂得,修修改改,晚上学习,白天实现功能,搞了几个月,实现的功能有,导入3d文件,展示楼层,设备参数展示,报警,位置提醒这些主要的功能,又感觉不满意,想要bim功能,又想要游戏效果,其..._webgl心得体会

【Allegro】关于焊盘与封装制作_anti-pad-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏15次。焊盘焊盘类型:规则焊盘(Regular Pad),反焊盘(Anti-Pad),热风焊盘,不规则焊盘。Regular Pad规则焊盘,即与元器件管脚焊接的有规则形状的焊盘。Anti-Pad反焊盘,使引脚和周围的铜区域不连接。Thermal Relief又称为花焊盘,热风焊盘,它的主要作用通过减少焊盘与电源和地层敷铜区的连接面积而防止焊接时焊盘散热太快不好焊。热风焊盘需要现在alleg..._anti-pad

随便推点

使用微信小程序开发制作一个简单的旅游攻略应用_微信小程序编写旅游小程序-程序员宅基地

文章浏览阅读300次,点赞6次,收藏12次。开发者只需熟悉微信小程序的开发流程和相关API,按照需求设计界面、编写交互逻辑,即可实现一个功能完备的小程序应用。当然,以上示例只是一个简单的示范,实际项目的开发还需要根据具体需求进行调整和完善。二、项目开发 1.创建项目 打开微信开发者工具,点击新建项目,填写项目名称和项目路径,选择对应的小程序类型,点击确定创建项目。以上是一个简单的旅游攻略应用的微信小程序开发示例,通过以上代码可以实现目的地、酒店和美食的展示和存储。可以使用微信小程序提供的组件进行页面的布局和样式的设置,也可以自定义组件来满足需求。_微信小程序编写旅游小程序

随笔---数据库索引总结_模糊查询 半包走索引-程序员宅基地

文章浏览阅读128次。建立索引的目的:加快查询的效率,当查询多于增删操作,适用于建立索引,建立索引的列,一旦进行增删改会进行索引的维护,也不宜大量建索引,索引会占用磁盘空间。建立索引的地方:数据库以查询为主,在经常查询的列上需要join的字段上,join的字段类型也应该相同多个列建立索引,能满足最左前缀原则主键,外键建立索引确保索引的唯一性数据长度较小的列,索引文件小如果一个列是比较长的字符串,为了加快这..._模糊查询 半包走索引

MySQL5.6 PERFORMANCE_SCHEMA 说明_mysql 5.6 关闭performance部分功能-程序员宅基地

文章浏览阅读1k次。背景: MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,需要手动开启,在配置文件里添加:[mysqld]performance_schema=ON_mysql 5.6 关闭performance部分功能

css首行缩进(css首行缩进)-程序员宅基地

文章浏览阅读7.1k次,点赞4次,收藏22次。首行缩进连个字符和首行缩进连个字是一样的概念?首行缩进连个字符和不一样的概念啊,字符和字是不一样的如何在css中控制段落的首行缩进??如何在css中控制段落的首行style="text-indent:24px"……控制段落缩进,24px是缩进距离……#####例如,拿你说的话举例:css中,我想..._css 首行缩进一个字

浏览器无法连接到代理服务器解决办法-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏3次。工具:WIN10 IE浏览器故障如图:方法如下:1.点击转到代理2.关闭-使用代理服务器3.刷新浏览器页面或重启浏览器_浏览器无法连接到代理服务器

echarts图表x轴数据太多显示不全的问题_echarts x轴内容太多 label 不显示后 图上的点就没了-程序员宅基地

文章浏览阅读1.8w次,点赞10次,收藏15次。问题如图,x轴数据条数过多可能导致x轴显示不全,开始我使用下面方法xAxis: { type: "category", min: min, max: max, data:time, axisLabel: { interval:num,//interval为x轴两..._echarts x轴内容太多 label 不显示后 图上的点就没了

推荐文章

热门文章

相关标签