shader入门3 使用结构体

代码

我们把上一篇的代码,复制粘贴改一改
瞧,它变成了新的代码

Shader "Custom/NewSurfaceShader"
{
	Properties{
		
	}
    SubShader
    {
		pass {
			CGPROGRAM
			//定义一个顶点处理函数
			#pragma vertex vert
			//定义一个片段处理函数
			#pragma fragment frag
			struct a2v {
				float4 vertex:POSITION;
				float3 normal:NORMAL;
				float4 texcoord : TEXCOORD0;
			};
			struct v2f {
				float4 position:SV_POSITION;
				float3 color:COLOR0;
			};
			v2f vert(a2v v) {
				v2f f;
				f.position = UnityObjectToClipPos(v.vertex);
				f.color = v.normal;
				return f;
			}
			fixed4 frag(v2f f) :SV_Target{
				return fixed4(f.color,1);
			}
			ENDCG
		}
    }
    FallBack "Diffuse"
}

解释

我们新定义了两个结构体,名字可以自己起的,但通常都用这个名字.
你是不是想问为什么取了这么个鬼名字?因为…也是老外起的
英语2(two) 和 to发音相同,于是
application to vertex变成了a2v
vertex to fragment变成了v2f

事实上渲染顺序也是a2v从模型空间拿了数据,然后计算之后传给了v2f,v2f计算后传给了系统.
看了第一篇和第二篇的话,下面的结构体和结构体里面的参数代表什么就不用说了.

注意结构体定义{}后面有分号

struct a2v {
	float4 vertex:POSITION;
	float3 normal:NORMAL;
	float4 texcoord : TEXCOORD0;
};
struct v2f {
	float4 position:SV_POSITION;
	float3 color:COLOR0;
};

然后我们来看看,又对代码动了什么手脚
我们在vert函数中定义了一个返回值f,然后算了一下f.position 也就是传给系统的那个屏幕坐标.
然后f.color=v.normal是什么意思呢,把法线的向量传给了颜色?是的,和英文意思一样,确实是把法线的向量传给了颜色
为什么这么做,以及这么做有什么效果?得先说说法线,就是初中物理光的反射里面那根垂直平面的线,在曲面3D物体里,基本每个点的法线都不一样,所以把法线赋值给颜色的话,效果就是颜色变成了七彩的效果

f中的color是个float3的值,所以我们再加个透明度值为1,返回给SV_Target
大功告成

v2f vert(a2v v) {
	v2f f;
	f.position = UnityObjectToClipPos(v.vertex);
	f.color = v.normal;
	return f;
}
fixed4 frag(v2f f) :SV_Target{
	return fixed4(f.color,1);
}

效果

第二个效果是fixed(f.color+0.5,1)变得淡了一些
七彩球

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值