首先是说一些关于着色器的一些基本知识
1.着色器类型类型,分别是固定管线着色器(将会淘汰)、顶点片元着色器、表面着色器。
顶点片元着色器:干预模型形态的着色器,例如带有波浪的水面,修改的就是波浪表面上每一个顶点的值。
表面着色器:干预像素的着色器,比如乌龟上面添加一个光照的纹理,使其有一种在水中游泳的感觉。
2.着色器与显卡的关系
显卡也就是GPU是图形运算处理中心两者的关系为
图形->添加到GPU(经过渲染管道进行渲染)->显示到屏幕上。
我们编写的shader程序就是顶点着色器与片元着色器。
3.相关知识杂谈
在不同的GPU中os、windows等,在不同类型的显卡中有不同的图形标准,如果不讲这些统一起来的话,有些东西只能在固定的GPU中运行,所以菜肴转趋动,通过驱动才可以统一标准—>DirectorX(图形标准),使不同的软件等在不同的显卡中也可以正常显示。
HLSL语言支持通过Director3D编写的着色器,只能在Director3D中使用
GLSL语言支持openGL上编shader程序。
Cg语言是NVDIAI和微软合作提供的语言,支持Director3D和openGL编写程序。我们编写shader程序一般都是用Cg语言,但是vs上是不会提示Cg语言的变量类型等信息的。
4.shader编程的基本结构
Shader “name”{// name shader 的名字
//定义一些属性,定义在这里的会在属性查看器里面显示;
[propeties]
//子着色器列表,一个shader必须至少有一个子着色器;
Subshaders;{。。。}
//如果子着色器显卡不支持,就会降级即fallback操作
{fallback}
}
1.Properties定义
name(“display name”,type) = 值
Name是变量名称、display name:显示到属性检查器中的名称
Type是变量的类型
值是默认值
注意: Name的规定就是使用下划线开始
例如
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness("Smoothness", Range(0,1)) = 0.5
_Metallic("Metallic", Range(0,1)) = 0.0
}
2.subshader的属性组成
其中每一个子着色器都可以有多个通道
上图的标签使用方法及类型
3.pass通道
Subshader包装了一个渲染方案,这些方案的执行途径是Pass subshader可以由很多个pass,每一个pass 都能令几何体渲染一次
Pass的基本语法是
Pass{[Name and tags] [RenderSetup][Texture Setup]}
在其他着色器的pass块中如果想要引用此通道,可以通过名字来引用减少重复操作,需要注意的是Name命令必须是大写,也就是说但凡是通道的名字必须要大写(unity引擎的规定)
通道类型分别有Regularpass、usePass、GrabPasss三种
普通通道的渲染设置
上图是普通通道类型的作用
Usepass的用处
插入所有来自其他着色器的给定名字的通道;
UsePass“Shader/Name”,Name为 着色器通道
使用方法:“Specular/BASE”//插入Specular中为Bass 的通道;
GrabPass{};一种特殊通道类型,他会捕获物体所在位置的屏幕的内通婚,并且写入一个纹理中,这个纹理能够呗用于后续通道中完成高级图像特效 ,后续通道可以使用
——Grabtexture进行访问;
使用Grabpass{纹理名称}捕获 屏幕内容到指定纹理中,后续通道可以通过纹理名称访问
5.shader中常用类型
其中的options是描述纹理属性的
6.unity坐标系转换
7.Cg语言的常用语义修饰
8.Cg语言基本类型表达式
定点数:用整数表示小数,比如有一个32位的操作系统,那么数字35.2的35,就存在前16位,2存后16位,所以,所谓的定点数就是用整数来表示小数。
在Cg中颜色就是用fixed来表示的,比浮点数更加高效。
Sampler来表示纹理对象,如果要向shader中关联一副图片,纹理或者texture,就使用sampler/1D/2D/3DCUBE/RECT,1D/2D等都是纹理,CUBE可以代表天空盒
9.标准内置函数