Shader Learing(Surface and Vertex&Fragment Shader篇)
Shader原理:
着色器(英语:shader)应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令,用于计算图像的颜色或明暗。但近来,它也能用于处理一些特殊效果,或者视频后处理。通俗地说,着色器告诉电脑如何用特有的一种方法去绘制物体。程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性。以前固有的流水线只能进行一些几何变换和像素灰度计算。现在可编程流水线还能处理所有像素、顶点、纹理的位置、色调、饱和度、明度、对比度并实时地绘制图像。着色器还能产生如模糊、高光、有体积光源、失焦、卡通渲染、色调分离、畸变、凹凸贴图、边缘检测、运动检测等效果。
Shader language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language),基于 Direct3D 的 HLSL (High Level Shading Language),还有NVIDIA公司的Cg (C for Graphic)语言。不过高级语言的一个重要特性是“独立于硬件”,在这一方面 shader language 暂时还做不到, shader language 完全依赖于 GPU 构架,这一特征在现阶段是非常明显的!任意一种 shader language 都必须基于图形硬件,所以 GPU 编程技术的发展本质上还是图形硬件的发展。在 shader language存在之前,展示基于图形硬件的编程能力只能靠低级的汇编语言。
Shader工作原理:GPU 上的两个组件: Programmable Vertex Processor (可编程顶点处理器,又称为顶点着色器)和 Programmable Fragment Processor (可编程片断处理器,又称为片断着色器)。顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于 4 阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还不行,这是顶点处理器的一个发展方向)。
CG语法:
一个Cg profile定义了一个“被特定图形硬件或API所支持的Cg语言子集”,任意一种shader language都是基于可编程图形硬件的(寄存器、指令集等),这也就意味着,不同的图形硬件对应着不同的功能子集。这些可选的语言功能包括某些控制结构和标准库函数。profile还定义了数据类型的精度,并且指定数据类型是否全局部或仅部分支持。profile按照功能可以划分为顶点profile和片段profile,而顶点profile和片段profile又基于OpenGL和DirectX的不同版本或扩展,划分为各种版本。Shader本身是一个单纯的单元,就是对输入(顶点或像素或物体)进行能做的算术运算,然后把结果送出的一个固件。
1、内置元类型
float:32 bit浮点类型/half:16 bit浮点/int:32 bit 整形/fixd:12 bit定点/bool:布尔值
Sampler*:纹理对象的句柄,分为 6 类:sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。string:不是每个都支持。
上述类型很多都被cg提供内置的向量数据类型(build-in vector data types),如float1/float4、bool2/bool3。Cg 还提供矩阵数据类型,不过最大的维数不能超过 4*4 阶:float1x1、float2x3
Cg 中向量、矩阵与数组是完全不同,向量和矩阵是内置的数据类型(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型。
数组类型/结构类型
关系操作符:< 小于,<= 小于或等于 ,!= 不等于 ,== 等于 ,>= 大于或等于,> 大于。
逻辑操作符:&& ,|| ,!
数学操作符: * 乘法;/ 除法; - 取反; + 加法;—减法; % 求余; ++ ;——;