实时渲染学习(二)GPU渲染管线与可编程着色器

写在最开始:
参考博文:【《Real-Time Rendering 3rd》 提炼总结】(三) 第三章 · GPU渲染管线与可编程着色器
注意区分图形渲染管线和GPU渲染管线。图形渲染管线包括应用程序阶段、几何阶段和光栅化阶段(详情见
实时渲染学习(一)图形渲染管线概括与总结)。而GPU渲染管线包括:

  • 顶点着色器(可编程)
  • 曲面细分着色器(可选,可编程)
  • 几何着色器(可选,可编程)
  • 裁剪(可配置)
  • 屏幕映射(固定)
  • 三角形设定(固定)
  • 三角形遍历(固定)
  • 片元(像素)着色器(可编程)
  • 合并阶段(可配置,包括混合、深度测试、模板测试等操作)

GPU管线概述

GPU管线包含图形渲染管线的几何阶段(顶点着色器、几何着色器、剪裁、屏幕映射)和光栅化阶段(三角形设定、三角形遍历、像素着色器、合并阶段)。

1. 可编程着色模型

第一个包含顶点处理,面向消费者的图形芯片(NVIDIA GeForce256)由NIVIDIA发布于1999年,并且首次提出了图形处理单元(GPU)的概念,与以往只能进行光栅化处理的图形芯片形成区分。

常见的着色器语言包括GLSL、HLSL和CG都是类C语言。绘制调用(Draw Call)会调用图形API绘制图元,令图形管线运行。

1.1 顶点着色器

顶点着色器可以选择在CPU/GPU中实现,一般在GPU中实现,若需要在CPU中实现,需要将CPU中输出的数据发送到GPU中光栅化。
在顶点着色阶段之前会进行一些数据操作。比如在DirectX中叫做输入装配(Input Assembler)的阶段,会将数据流组织在一起,形成顶点和基元的集合,发送到管线。
顶点着色器中每个顶点被独立地处理,互不影响。顶点着色器提供了修改,创建,或者忽略与每个顶点相关的属性(如位置,颜色,法线,纹理坐标)。通常,顶点着色器程序将顶点从模型空间变换到齐次裁剪空间(MVP矩阵)。

1.2 曲面细分着色器

包括细分控制着色器和细分计算着色器,主要用于对传入的顶点数据实时插值计算,以生成几何体中的附加顶点,也可以用于执行几何体的自适应细分操作,可以提升原图质量和LOD。

1.3 几何着色器

几何着色器(Geometry Shader)是顶点和片段着色器之间一个可选的着色器。
几何着色器的输入是一个单独的类型:点,线段,三角形,几何着色器可以改变传递进来的图元的拓扑结构,且几何着色器可以接收任何拓扑类型的图元,但是只能输出点、折线和三角形条。若未添加几何着色器,则默认行为是直接输出三角形,添加后可以修改输出图形。

流输出(Stream Output)

GPU的管线的标准使用方式是发送数据到顶点着色器,然后顺序进行光栅化处理,再传入像素着色器。 也就是,数据总是通过管线传递,无法访问中间结果。
流输出在Shader Model 4.0中被引入。在顶点着色器(以及可选的几何着色器中)处理顶点之后,除了将数据发送到光栅化阶段之外,也可以输出到流,也就是一个有序数组中进行处理。以这种方式处理的数据可以通过管线回传,从而允许迭代处理。

1.4 像素着色器

也称为片元着色器、片段着色器,用于逐像素计算颜色,在每一个像素上执行着色操作。
像素着色器常用于处理光照及与之相关的效果,如凹凸纹理和调色。像素着色器的调用和屏幕上像素的显示并非一一对应,对于一个像素可能会被调用若干次来确定其最终颜色。

2. 合并阶段

本阶段不可编程,但高度可配置。
合并阶段用于将像素着色器中生成的各个片元的深度和颜色与帧缓冲结合在一起,即进行模板缓冲(Stencil-Buffer)和Z缓冲(Z-buffer)操作。最常用于透明处理(Transparency)和颜色混合(Color Blending)操作也是在本阶段进行的。

扫描二维码关注公众号,回复: 5890394 查看本文章

猜你喜欢

转载自blog.csdn.net/ljytower/article/details/89261860