zoukankan      html  css  js  c++  java
  • [小明学Shader]9.顶点方法(Vertex Function)和顶点色

      渲染过程中,Shader总是优先对每个顶点进行计算(这里如果我们用顶点方法,那么我们的顶点方法就会被调用);顶点计算出后按照一定的格式输出给下面的流程,其中的某一步就是我们放置的surfa方法,它接收的输入可以进行一定的控制(我们将用顶点方法输出).

      整个 shader 相关流程如下:
      1、 shader 准备对一个顶点进行计算。因我们自定义顶点方法,因此 vert 被调⽤
      2、 vert 的第一参数决定该顶点需要带进来哪些属性,我们得到这个属性里的顶点色,把这个顶点色放到 Input 结构中,以供后续的 surf 使用;
      

    Shader代码:

    Shader "Custom/11.30/0"{
        Properties{
            _MainTex("Base(RGB)",2D)="white"{}
        }
        SubShader{
            Tags{"RenderType"="Opaque"}
            LOD 200
            CGPROGRAM
            #pragma surface surf Lambert vertex:Vetx
            
            sampler2D _MainTex;
            
            struct Input{
                float2 uv_MainTex;
                float4 vertColor;
            };
            
            void surf(Input In,inout SurfaceOutput o){
                half4 c=tex2D(_MainTex,In.uv_MainTex);
                
                o.Albedo=c.rgb*In.vertColor;
            }
            
            void Vetx(inout appdata_full v,out Input o){
                UNITY_INITIALIZE_OUTPUT(Input,o);
                
                o.vertColor=v.color;
            }
            
            ENDCG
        }
    }

      上述代码中,我们用到了这一行

    #pragma surface surf Lambert vertex:vert

      在光照模型方法后我们加了 vertex:vert,其中 vertex 是关键词,后面跟冒号,再跟一个我们定义的名字,对应到下面的一个方法。这个用来告诉 Unity 编译我们的 shader 的时候,我们需要对顶点做一些相关的操作,所以请它在编译的时候,把我们指定的顶点方法编译,以便让 Unity 引擎执行该 shader 程序的时候用上我们的顶点方法。
    再来看指定的这个方法的内容

    void vert(inout appdata_full v, out Input o)
    {
      UNITY_INITIALIZE_OUTPUT(Input,o);
      o.vertColor = v.color;
    }

    第一个参数的类型是 appdata_full,这个是从应用程序往 shader 中送入的数据的结构,如位置(vertex)、法线(normal),加上我们这在介绍的顶点色(color)。

    struct appdata_full
    {
      float4 vertex : POSITION;
      float4 tangent : TANGENT;
      float3 normal : NORMAL;
      float4 texcoord : TEXCOORD0;
      float4 texcoord1 : TEXCOORD1;
      fixed4 color : COLOR;
    #if defined(SHADER_API_XBOX360)
      half4 texcoord2 : TEXCOORD2;
      half4 texcoord3 : TEXCOORD3;
      half4 texcoord4 : TEXCOORD4;
      half4 texcoord5 : TEXCOORD5;
    #endif
    };

          

      虽然有了shader,但是还要对模型传入顶点色,我们用一段c#代码实现.

          程序代码:

    using UnityEngine;
    using System.Collections;
    
    public class Class11_30 : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            Mesh mesh = GetComponent<MeshFilter> ().mesh;
    
            Vector3[] vertices = mesh.vertices;
            Color[] colors = new Color[vertices.Length];
    
            colors [0] = Color.red;
    
            mesh.colors = colors;
        }
    
    }

      效果图:

        因为顶点太多,而只赋值了第一个顶点的颜色,所以看起来只有第一个顶点到其它顶点的插值效果如图.

  • 相关阅读:
    3513: [MUTC2013]idiots
    ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台(elk5.2+filebeat2.11)
    【python全栈开发】初识python
    SQL疑难问题
    费用分摊问题
    透过现象看本质
    关于python3round与float的四省五入精度的问题
    Win10下VSCode安装PlantUML
    安装pymssql
    ensorFlow的安装
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/5007529.html
Copyright © 2011-2022 走看看