最近准备系统的整理和学习下shader编程 查了下网上的一些资料 说一下本身对shader工做原理的理解前端
简单说来shader 就是能够运行在gpu上可编程的图形程序编程
shader 分为顶点着色器和片断着色器数组
关于顶点着色器和片断着色器的含义学习
顶点着色器和片断着色器被分离为可编程的编程的单元排序
顶点和片断着色器都拥有强大的并行计算能力,擅长于矩阵计算(不高于4阶),片断着色器能够高速查询纹理数据信息,目前顶点着色器还不行。字符串
从图中能够知道GPU渲染管线原理
顶点着色器控制顶点坐标转换过程;片断着色器控制像素颜色计算过程。简单明了就是顶点着色器负责处理坐标信息,片断着色器负责处理像素颜色数据计算。vert和frag就是这样分工的;前者的输出是后者的输入。渲染
那么这些着色器都是依赖图形硬件的 因此图形硬件的发展和shader 的发展密切相关硬件
咱们再来看看图形硬件编程的输出和输入sso
可编程图形硬件的输入/输出。输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;纹理buffer存放纹理数据,目前大多数的可编程图形硬件只支持片断处理器处理纹理;从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程当中产生的临时数据。
咱们再来看看顶点着色器和片断着色器的数据处理流程
Vertex shader program(顶点着色程序)和Fragment shader program(片段着色程序)分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程片段处理器)所执行。
顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操做,最后将计算好的数据传送到指定寄存器中;而后片段着色程序从中获取须要的数据,一般为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(若是有的话)进行每一个片段的颜色计算,最后将处理后的数据送光栅操做模块。
片段着色程序对每一个片段进行独立的颜色计算,最后输出颜色值的就是该片断最终显示的颜色。能够这样说,顶点着色程序主要进行几何方面的运算,而片断着色程序主要针对最终的颜色值进行计算。
片断着色程序还有一个突出的特色是:拥有检索纹理的能力。对于GPU而言,纹理等价于数组,这意味着,若是要作通用计算,例如数组排序、字符串检索等,就必须使用到片断着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。