Skip to content

Latest commit

 

History

History
60 lines (47 loc) · 1.52 KB

Chapter5.md

File metadata and controls

60 lines (47 loc) · 1.52 KB

一个简单的顶点/片元着色器

??? note "示例代码" ``` cpp Shader "Unity Shaders Book/Chapter 5/Simple Shader"{ Properties{ _Color ("Color Tint",Color) = (1.0,1.0,1.0,1.0) }

SubShader{
	Pass{
		CGPROGRAM

		#pragma vertex vert
		#pragma fragment frag

		fixed4 _Color;

		struct a2v {
			float4 vertex : POSITION;
			float3 normal : NORMAL;
			float4 texcoord : TEXCOORD0;
		};

		struct v2f{
			float4 pos:SV_POSITION;
			fixed3 color : COLOR0;
		};

		v2f vert(a2v v) {
			v2f o;
			o.pos=UnityObjectToClipPos(v.vertex);
			o.color =v.normal*0.5+fixed3(0.5,0.5,0.5);
			return o;
		}

		fixed4 frag(v2f i) : SV_Target{
			return fixed4(i.color,1.0);
		}

		ENDCG
	}
}
}
```

代码基础结构

  • Shader下可以有多个 SubShader(每个SubShader表示适配某个显卡,如果都不适配,则会调用默认的SubShader)
  • Properties :在里面定义一些属性。

!!! warning "" 在定义属性的时候,要注意与Properties中声明的类型和属性名称保持一致

  • a2v :application to vertex shader
  • v2f :vertex shader to fragment shader
  • #pragma vertex name :用于表明,name函数是vertex内的。frag同理。
  • 关于语义 : 在上文的 SV_POSITION,POSITION这些皆为语义,用来告诉渲染器这些变量从哪来到哪去。

!!! warning "" 顶点着色器的输出结构必须包含SV_POSITION。顶点着色器主要功能是将顶点从模型空间转换到裁剪空间,并通过SV_POSITION告诉渲染器。