UnityShader学习之旅 三

  • 第一个顶点/片元着色器
Shader "Unlit/Chapter5/SimpleShader" //shader的名字
{
	SubShader {
		Pass {
			//渲染通道 一个占用
    			CGPROGRAM
    			#pragma vertex vert //vert 就是函数名称 定义顶点
    			#pragma fragment frag // frag 就是name 定义片元
			/*
			float4: float类型的四维变量为返回值
			POSITION: 模型的顶点信息
			float4 v:就是一个输入变量,包含了顶点位置POSITION
			SV_POSITION:顶点着色器的输出的是顶点坐标
			*/
			float4 vert(float4 v : POSITION) : SV_POSITION 
    			{ 
    				//模型坐标转换到裁剪坐标 矩阵
     				return UnityObjectToClipPos(v); 
    			}
    			/*
    			frag:前面定义的片元函数名
			SV_TARGET:输出存储到的渲染目标
			*/
    			fixed4 frag() : SV_TARGET
    			{
    				//返回了一个xx颜色 RGBA[0,1]
     				return fixed4(0.87,0.61,0.19,0.82);
    			}
    			ENDCG
		}
	}
	FallBack "Diffuse"
}

Unity支持的语义
1.应用阶段传递模型数据到顶点着色器

语义描述类型分量范围
POSITION模型空间中的顶点位置float4
NORMAL顶点法线float3[-1,1]
TANGENT顶点切线float4
TEXCOORDn1该顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标float2/float4
COLOR顶点颜色fixed4/float4[0,1]

2.顶点着色器传递数据给片元着色器

语义描述
SV_POSITION裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,否则渲染器无法得到裁剪空间中的顶点坐标
TEXCOORD0~7用于输出纹理坐标
COLOR0用于输出第一组顶点颜色
COLOR1用于输出第二组顶点颜色

3.片元着色器的输出

语义描述
SV_Target输出值将会存储到渲染目标中
  • 在材质面板上显示一个颜色拾取器
Shader "Unlit/Chapter5/ColorTint" //shader的名字
{
	Properties{
		//声明一个Color类型的属性
		_Color("Color Tint",Color) = (1,1,1,1)
	}	
	SubShader{
		Pass{
			CGPROGRAM
			#pragma vertext vert
			#pragma fragment frag
			 //定义顶点输入结构体
			struct a2v{
				float4 vertex:POSITION; 	//模型顶点填充vertex
				float3 normal:NORMAL;		//顶点法线填充normal
				float4 texcoord:TEXCOORD0;	//第一组纹理填充texcoord
			};
			//定义顶点输出/片元的输入结构体
			struct v2f{
				float4 pos:SV_POSITION;		//pos包含了顶点在裁剪空间中的位置信息
				float3 color:COLOR0;		//存储颜色信息
			};
		}
		//CG代码中需要能够访问到属性的变量
		float4 _Color;
		v2f vert(av2 v){
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertext);
			//法线的分量范围为【-1,1】需要映射到【0,1】
			o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
			return o;
		}
		fixed4 frag(v2f i):SV_Target{
			fixed3 c = i.color;
			c *= _Color.rgb; //使用_Color属性来控制输出颜色
			return fixed4(c, 1.0);
		}
		ENDCG
	}
	 Fallback "Diffuse"
}

在这里插入图片描述在这里插入图片描述

着色器调用方式输入输出
顶点着色器逐顶点模型数据传递给片元着色器
片元着色器逐片元顶点着色器的输出插值结果渲染目标

  1. n的数目与ShaderModel有关。Shader Model [2,3]–>8 /[4,5]–>16
    Shader Model:决定了shader中各个特性的能力。运算指令数目、寄存器个数等
    一个模型的纹理坐标组数一般不超过2。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值