zoukankan      html  css  js  c++  java
  • UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

      顶点片段着色器

      V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用的是CG/HLSL语法。分为vertex顶点部分和Fragment像素部分。

      本篇的末尾讲述顶点函数传入的结构体类型的参数appdata_base。

    Shader "Custom/Exam1" {
        Properties {
        _MainTex ("Texture", 2D) = "white" { }   //引号里面的"Texture"则是Unity检视面板中对应显示的属性名称
        }
        SubShader
        {
            pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                sampler2D _MainTex;
                float4 _MainTex_ST;
                struct v2f {
                    float4  pos : SV_POSITION;
                    float2  uv : TEXCOORD0;
                } ;
                v2f vert (appdata_base v)
                {
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP,v.vertex); //MVP矩阵变换,将裁剪空间坐标转换为相对屏幕位置的UV坐标
                    o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); //TRANSFORM_TEX的作用是用顶点的UV v.texcoord和材质球的采样图片_MainTex做运算,确保顶点材质球里的缩放和偏移是正确的。
                    return o;
                }
                float4 frag (v2f i) : COLOR
                {
                    float4 texCol = tex2D(_MainTex,i.uv);
                    float4 outp = texCol;
                    return outp;
                }
                ENDCG
            }
        }
    }

      这里有一张图片,直接山寨过来吧。

      

      顶点片段着色器,用文字描述永远不及一张图解。

      顶点函数传入的结构体参数:

      只要引用UnityCg.cginc头文件(目录Unity > Editor > Data > CGIncludes下)就可以使用预先设定好的结构体直接使用,他们分别有appdata_base  appdata_tan和appdata_full:

      如下所示:

      注:顶点坐标和正切线为什么是float4,这有点意思,因为这里它表示是齐次坐标,比如我们这样表示一个float4(x,y,z,w),当w = 1的时候它表示点(x,y,z),当w= 0的时候它表示一个向量(x,y,z)。区别就在这里,当W为1时表示点,当W为0时表示向量。

      texcoord0和texcoord1分别表示两层UV,有时候我们模型上的贴图需要多个图片一起贴在一处,那么贴两层就会有两层UV,至于更多的层数,这里就不讲了,因为更深入的笔者也并不是特别了解,当然学过美术的,对这个应该是非常的了解。

      以下三种类型为Unity内置的顶点Shader传入结构体,如果想自定义也是可以的,但是自定义结构体里面的属性,必须是基于appdata_full的,这样才能识别出来,也就是自定义的结构里的属性必须到appdata_full里的属性里去选。

    struct appdata_base {
        float4 vertex : POSITION; //顶点坐标
        float3 normal : NORMAL;//法线
        float4 texcoord : TEXCOORD0;//UV
    };
    struct appdata_tan {
    
        float4 vertex : POSITION;
        float4 tangent : TANGENT;
        float3 normal : NORMAL;
        float4 texcoord : TEXCOORD0;
    };
    struct appdata_full {
        float4 vertex : POSITION;//顶点坐标
        float4 tangent : TANGENT;//正切
        float3 normal : NORMAL;//法线
        float4 texcoord : TEXCOORD0;//第一层UV
        float4 texcoord1 : TEXCOORD1; //第二层UV
        fixed4 color : COLOR; //颜色
    };
    小时候我把老婆种到地下,长大了我能收获一大堆老婆! 我是威少,我是一名Unity游戏的主程,我为自己带盐,希望此文能给您一点点微不足道的帮助,祝你成功!
  • 相关阅读:
    zbb20171108 一台电脑启动多个 tomcat
    zbb20171101 oracle 启动 linux
    zbb20171017 svn Cleanup failed to process the following paths错误的解决
    zbb20171013 mysql服务重启 重启服务 重启mysql服务
    zbb20171013 mysql 远程连接 报错 1130-host ... is not allowed to connect to this MySql server
    zbb20171013 svnserver 修改默认端口
    zbb20171013 tomcat 设置访问ip地址直接访问项目
    zbb20171013 Windows 下端口占用 查询 以及结束进程的方法
    20171012 nginx 超时时间配置
    20171012 tomcat 超时时间配置
  • 原文地址:https://www.cnblogs.com/vsirWaiter/p/5995287.html
Copyright © 2011-2022 走看看