【图形学】13 UnityShader语义(一)

来源:《UNITY SHADER入门精要》

1、UnityShader基本结构

Shader "Unity Shaders"{
	SubShader{
		Pass{
			CGPROGRAM
			#pragma vertext vert
			#pragma fragment frag
			
			float4 vert(float4 v : POSITION) : SV_POSITION{
				return mul(UNITY_MATRIX_MVP, v);
			}
			
			fixed4 frag() : SV_Target{
				return fixed4(1.0, 1.0, 1.0, 1.0);
			}
			ENDCG
		}
	}
}

  ①第5、6行的#pragma vertext vert#pragma fragment frag这两条编译指令将告诉Unity,哪个函数包含了片元着色器的代码,哪个函数包含了顶点着色器的代码。
  ②第8、9行的函数:

float4 vert(float4 v : POSITION) : SV_POSITION{
	return mul(UNITY_MATRIX_MVP, v);
}

首先,它返回的是一个 float4 类型的变量。POSITIONSV_POSITION 都是 CG/HLSL 中的 语义(semantics),这些语义讲告诉系统哪些是输入值,哪些是输出值。这里,POSITION 表达的是 把模型空间的顶点填充到输入参数 v 中, SV_POSITION 将告诉 Unity 顶点着色器的输出是裁剪空间中的顶点坐标。
  ③第12、13行的函数:

fixed4 frag() : SV_Target{
	return fixed4(1.0, 1.0, 1.0, 1.0);
}

这个函数返回一个 fixed4 类型的值,返回的是 SV_Target 这也是 HLSL 中的一个系统语义,它告诉渲染器,把用户的输出颜色储存到一个渲染目标之中,这里将输出到磨人的帧缓存中。片元着色器中的代码很简单,返回的一个表示白色的 fixed4 类型的变量。片元着色器的输出的颜色的每个分量范围在 [0, 1]之间。(1,1,1)代表白色。

2、ShaderLab中的结构体

 &emsp我们想要得到模型上每个顶点的坐标和法线向量。

Shader "MyShader"{
	SubShader{
		Pass{
			CGPROFRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			struct a2v{
				// POSITION 语义告诉Unity,用模型空间的顶点坐标填充vertex变量
				float4 vertex : POSITION;
				// NORMAL 语义告诉Unity,用模型空间的法线方向填充normal变量
				float3 normal : NORMAL;
				//TEXCOORD0 语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
				float4 textcoord : TEXCOORD0;
			};
			
			struct v2f{
				float4 ppos : SV_POSITION;
				fixed3 color : COLOR0;
			}
			
			float4 vert(a2v v) : SV_POSITION{
				return mul(UNITY_MATRIX_MVP, v.vertex);
			}
			
			fixed4 frag() : SV_Target{
				return fixed(1.0, 1.0, 1.0, 1.0);
			}
			
			ENDCG
		}
	}
}

  上述代码的9-16行,我们定义一个新的结构体a2v,其中使用了更多的Unity支持的语义:NORMAL(法线)、TEXCOORD0(纹理坐标)。
  其中,我们命名结构体的名字 a2v 是什么含义呢?a代表 application,v代表vertex shader,a2v 代表把数据从 应用阶段 转到 顶点着色器。
  18-21行定义了 v2f ,其中,SV_POSITION 语义是最终裁剪空间的意思,而COLOR0 的语义规则可以由用户自行定义,用来存储颜色。

3、Properties 属性

Shader "MyShader"{
	Proerties{
		_Color ("颜色", Color) = (1.0, 1.0, 1.0, 1.0)
	}
	SubShader{
		Pass{
			CGPROGRAM
			
			#pragma vertex vert
			#prama fragment frag
			
			fixed _Color;
			float4 vert(){...}
			float4 frag(){...}
		}
	}
}

  在上面的代码中,我们声明的是一个 Color 类型的变量,也赋予了它初始值。为了能够在CG代码中访问它,我们需要定一个变量,在12行,这个变量名称和类型必须和 Properties 语义块中的属性定义相匹配。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0OfPloqI-1659407792235)(assets/image-20220616164920110.png)]

4、uniform关键字

  有时,我们可能会发现在CG变量前会有一个 uniform 关键字,例如:

uniform fixed4 _Color;

  uniform关键词是CG中修饰变量和参数的一种修饰词,它仅仅用于提供一些关于该变量的初始值是如何指定和存储的相关信息(这和其他一些图像编程接口中的uniform关键词的作用不太一样)。在Unity Shader中,uniform关键词是可以省略的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值