第一个CG程序
Shader "Sbin/vf"
{
SubShader
{
pass
{
CGPROGRAM
// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it uses non-square matrices
#pragma exclude_renderers gles
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members pos,uv)
#pragma exclude_renderers d3d11 xbox360
#pragma vertex vert
#pragma fragment frag
//静态宏
#define MACROEL FL4(fl4.ab,fl3.zy);
//结构体
struct v2f
{
float4 pos;
float2 uv;
}
//为某一类定义别名
typedef float4 FL4;
//顶点程序 冒号后面的是语意 顶点程序必须输出float4 4阶向量
void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
{
pos=float4(objPos,0,1);
col=pos;
}
//片段程序为了最后的颜色计算
void frag(inout float4 col:COLOR)
{
//col=float4(0,1,0,1);
fixed r=1;//fixed 2的8次256, 256*256*256=16777216帧色彩
fixed g=0;//对颜色的输出最优化是用fixed
fixed b=0;
fixed a=1;
col=fixed4(r,g,b,a);
bool b1=false;
col=b1?col:fixed4(0,1,0,1);
float2 fl2=float2(1,0);
float3 fl3=float3(1,0,1);
float4 fl4=float4(1,1,0,1);
宏的使用
FL4 fl=MACROFL
col=f1;
//矩阵
float2x4 M2x4={fl4,{0,1,0,1}};
col=M2x4[0];
//数组
float aar[4]={1,0.5,0,0.5};
col=float4{aar[0],aar[1],aar[2],aar[3]};
v2f o;
o.pos=fl4;
o.uv=fl2;
}
ENDCG
}
}
}
条件判断 if else if
循环用 while do{} while()
for() 循环次数不能超过1023次
不支持Swith case
Shader "Sbin/vf1" {
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
void vert(in float2 objPos:POSITION,out float4 pos:POSITION, out float4 col:COLOR)
{
pos=float4(objPos,0,1);
if(pos.x<0 && pos.y<0)
{
col=float4(1,0,0,1);
}
else if(pos.x<0)
{
col=float4(0,1,0,1);
}
else if(pos.y>0)
{
col=float4(1,1,0,1);
}
else
{
col=float4(0,0,1,1);
}
//col=pos;
}
void frag(inout float4 col:COLOR)
{
int i=0;
while(i<1023)
{
i++;
}
if(i==10)
col=float4(0,0,0,1);
i=0;
do{
i++;
}
while(i<10);
if(i==10)
col=float4(1,1,1,1);
for(i=0;i<1023;i++)
{
}
if(i==1023)
col=float4(0.5,0.5f,0,1);
}
ENDCG
}
}
}
自定义函数,应用的函数要放前面,函数前向声明 函数传参 cginclude
Shader "Sbin/vf2" {
properties{
_MainColor("Main Color",color)=(1,1,1,1)
}
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用公用方法 Unity\Editor\Data\CGIncludes\sbin
#include "sbin/sbin.cginc"
float4 _MainColor;
float4 _SecondColor;
struct v2f{
float4 pos: POSITION;
float2 objPos:TEXCOORD0;
fixed4 col:COLOR;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=float4(v.pos,0,1);
o.objPos=float2(1,0);
o.col=v.col;//float4(0,1,0,1);
return o;
}
fixed4 frag(v2f IN):COLOR
{
//Func(col);
// float arr[]={0.5,0.5};
// col.y=Func2(arr);
// return col;
//return fixed4(opos,0,1);
//return _MainColor*_SecondColor;//IN.col;
// return _MainColor*0.5 + _SecondColor*0.5;
return lerp(_MainColor,_SecondColor,0.7);
}
ENDCG
}
}
}
void Func(out float4 o)
{
o=float4(0,1,0,1);
}
float Func2(float aar[2])
{
float sum=0;
for(int i=0;i<aar.Length;i++)
{
sum+=aar[i];
}
return sum;
}
数学函数:
x的y次方 pow(x,y)
x的平方根 sprt(x)
dot(A,B) A的平方+B的平方
lerp(a,b,f) a+f(b-a)的值
saturate(a) x<0返回0,x>1返回1 否则返回x
max(a,b) 返回最大值
transpise(M) M 矩阵转置
几何函数
distance(pt1,pt2) 亮点之间的距离
length(v) 即 sprt(dot(v,v)) 向量的模
faceforword(N,I,Ng) Ng*i<0返回N,否则返回-N
Normalize(v) 求单位向量
Reflect(I,N) i为入射方向向量,N为顶点法向量, 用来计算反射光方向向量,i和N必须被归一化
Refract(I,N,eta) 折射向量,eta为折射系数
3:纹理映射 ==采样
4:偏导函数 ddx(a) a对应一个像素位素,返回在x轴上的偏导数
ddy(a)