文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体、斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!
3.2 Vertex Shader Program
Vertex shader program(顶点着色程序)和 Fragment shader program(片断着 色程序)分别被 Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程片断处理器)所执行。
顶点着色程序从 GPU 前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,后将处理后的数据送光栅操作模块。
图 10 展示了在顶点着色器和像素着色器的数据处理流程。在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到 vertex buffer 中;纹理信息传递到 texture buffer 中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。
顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如, 输入一个三角面片,顶点着色程序对其进行 phong 光照计算,只计算三个顶点的光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand 明暗处理或 者快速 phong 明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较好(快速 phong 明暗处理),则效果也会较好;如果图形硬件使用 Gourand 明暗处理算法,则会出现马赫带效应(条带化)。
而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写, 不但可控性好,而且可以达到更好的效果。
由于 GPU 对数据进行并行处理,所以每个数据都会执行一次 shader 程序程序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。
图 10 顶点着色器和像素着色器的数据处理流程
网友评论