【Reading Notes】CP5-Vertex Functions (着色器顶点处理)

写在前面

Shader主要是用来模拟3D对象光照的真实情况,但不仅仅如此,他不仅仅定义了Objects看起来怎么样,还可以完全的重定义Objects的形状。

在这一章节,将学到:
+ 在Surface Shader访问顶点颜色
+ 在Surface Shader实现顶点动画
+ 挤压使模型变形
+ 实现雪
+ 实现体积爆炸效果

简介

在第一章节,创建了第一个shader,解释了3D模型不仅仅是三角面片的集合体。每个顶点还会包含一些额外的数据,为了更好的渲染他自己。这里将探索怎么去访问这下数据,并且在我们shader中使用。

通过Surface Shader访问顶点颜色

首先需要知道的是,一个顶点函数可以返回关于顶点自身的信息,并且是我们可以控制的。我们可以接收到顶点的法向量(一个float3值),顶点的位置(float3),你还可以往里面存储颜色(float4)。这里将展示如何去保存顶点颜色,以及如果利用顶点颜色。

  1. 我们需要定义vert函数的返回结构

    struct Input
    {
    float2 uv_MainTex;
    float2 vertColor;
    }

  2. 从输入中获取顶点颜色,并返回

    struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    float4 texcoord2 : TEXCOORD2;
    float4 texcoord3 : TEXCOORD3;
    fixed4 color : COLOR;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    };

上面是Unity内置定义的完整顶点结构,我们将从color字段获取倒顶点颜色,所以顶点函数大概长这个样子

void vert(inout appdata_full v, out Input o)
{
    o.verColor = v.color;
}
  1. 在Surface中使用

最后在surf中对颜色进行最终的处理已达到我们想要的效果

void surf(Input IN, inout SurfaceOutput o)
{
    o.Albedo = IN.vertColor.rgb * _MainTint.rgb; //简单的和主颜色叠加
}

更多

我们还可以使用vert color的第四个字段,因为我们定义的结构是一个float4类型的值。这意味着我们可以传递顶点的Alpha。你可以利用这个字段去优化对象的显示,实际上第四个字段的意义可以完全由开发者自己去控制,例如Alpha,添加透明,提供一个掩码去做纹理混合。

在Unity5中,可以使用DirectX11去编译我们的shader,但有一点瑕疵是Unity将不会给你任何提醒,即使是你的shader不能通过编译。仅仅需要在vert中添加一行代码:

void vert(inout appdata_full v, out Input o)
{
    UNITY_INITALIZE_OUTPUT(Input, o);
    o.vertColor = v.color;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值