Unity3D shader(5)——vertex shader(一)

基于顶点和片面的shader和surface shader还是有很多区别的,其中最基本的是语法区别。surface shader可以理解为是包装好的基于顶点和片面的shader语句。学习基于顶点和片面的shader语句更能理解其中蕴含的逻辑原理。

1、首先看一个简单的点和片面的shader语句:

Shader "Example/vf" {
 
  SubShader {
    pass { 
    
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

    void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
    {
    pos=float4(objPos,0,1);   
     col=pos;
    }
    void frag(inout float4 col:COLOR)
    {
       //col=float4(0,1,0,1);
    }
    ENDCG
    }
   }
}
2、在这个语句里,首先需要在subshader里建一个pass通道,然后在通道里定义cg模块,接着需要顶底顶点函数(#pragma vertex vert),片面函数(#pragma fragment frag),然后在顶点函数中输入相关的颜色信息void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR),在片段函数中输出颜色信息void frag(inout float4 col:COLOR)

接着,来看一个变种,就是顶点函数既然是输出函数,那么我们直接用Return返回颜色,岂不是更直观,所以在这里修改一下顶点输出函数。那么直接看一下上述代码的修改版(float4 vert(in float2 objPos:POSITION,out float4 pos:POSITION):COLOR)。

Shader "Example/vf" {
 
  SubShader {
    pass { 
    
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

    float4 vert(in float2 objPos:POSITION,out float4 pos:POSITION):COLOR
    {
    pos=float4(objPos,0,1);   
     return pos;
    }
    float4 frag(in float4 col:COLOR):color
    {
       //col=float4(0,1,0,1);
       return col;
    }
    ENDCG
    }
   }
}



3、更进一步,上面发现顶点函数只是输出颜色信息,如果我们需要物体的位置信息,那就比较麻烦了,所以直接应用结构(struct)来解决多个数据传输的问题.这里在结构体里传递位置信息,颜色信息,看以下代码。

Shader "Example/vf" {
 
  SubShader {
    pass { 
    
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

    struct v2f{
    float4 pos:POSITION;
    float2 objPos:TEXCOORD0;
    float4 col:color;
    } ;

    v2f vert(in float2 objPos:POSITION)
    {
    v2f o;
    o.pos=float4(objPos,0,1);
    o.objPos=float2(1,0);
    o.col=float4(0,1,0,1);   
     return o;
    }
    float4 frag(v2f IN):color
    {
       //col=float4(0,1,0,1);
       //return float4(objPos,0,1);
      return IN.col;
    }

    ENDCG
    }
   }
}

效果同上。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值