graphics-doc-shader基础

Shader Language 原理

使用 shader language 编写的程序称之为 shader program(着色程序)。着色程序分为两类: vertex shader program(顶点着色程序)和 fragment shader program(片断着色程序)。

着色器运行在GPU的Programmable Vertex Processor(可编程顶点处理器,又称为顶点着色器)和 Programmable Fragment Processor(可编程片断处理器,又称为片断着色器)两个组件上。

顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于 4 阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还不行,这是顶点处理器的一个发展方向)。

顶点着色器控制顶点坐标转换过程;片段着色器控制像素颜色计算过程。这样就区分出顶点着色程序和片段着色程序的各自分工: Vertex program 负责顶点坐标变换; Fragment program 负责像素颜色计算;前者的输出是后者的输入。

由于 GPU 对数据进行并行处理,所以每个数据都会执行一次 shader 程序程序。 即,每个顶点数据都会执行一次顶点程序; 每个片段都会执行一次片段程序。

可编程图形渲染管线

可编程图形渲染管线

输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;纹理 buffer 存放纹理数据,目前大多数的可编程图形硬件只支持片段处理器处理纹理; 从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程中产生的临时数据。

可编程图形硬件输入与输出

可编程图形硬件输入与输出

Vertex Shader Program

顶点着色程序从 GPU 前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。

在应用程序中阶段,图元信息(顶点位置坐标、颜色、纹理坐标等)传递到 vertex buffer 中;纹理信息传递到 texture buffer 中。

顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作, 而顶点内部的点则按照硬件默认的方式自动插值。

Fragment Shader Program

片断着色程序对每个片断进行独立的颜色计算, 最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。

片段着色程序还有一个突出的特点是: 拥有检索纹理的能力。 对于 GPU 而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。

概念

片段

片断是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。