Shader03_CG

第一个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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值