Unity5.0 Shader 极简入门 (四)

原创 2017年09月10日 16:26:43

很久没写shader笔记了,最近一直在啃,刚刚有点新进度
这次来编写一个拥有两层UV通道的shader,通常第一层UV通道贴漫反射贴图,而第二层UV通道贴灯光贴图。
这里写图片描述

这里我制作了两种UV方案进行对比:两种方案的区别:
第一种:UV可以被平移,缩放操作。第二种UV不可以被用户平移缩放操作。

方案1

Shader "LiShader/mytest 1 "
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _AOmap ("lightmap",2D) = "white"{}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
        //CG语言开始
            CGPROGRAM

            //像C#和java语言会有主函数main,这样程序运行的时候,先找主函数main运行,领起整个程序一样。
            //shader也有主函数,但是是两个,一个顶点着色主函数,一个片元着色主函数。命名上自由一些,我们可以随便起名字

            //我设置DingDianShader 是我的 顶点着色主函数。
            #pragma vertex DingDianShader

            //PianYuanShader 是我的 片元着色主函数。
            #pragma fragment PianYuanShader

            //然后倒入一个我们必须要用到的类,固定用法
            #include "UnityCG.cginc"

            //初始化GPU前端数据,准备送给顶点着色处理器。获取语义类型如下:顶点位置,UV1通道,UV2通道,这些语义类型是专有名字死记硬背吧。
            struct appdata
            {
                float4 fbxvertex : POSITION;
                float2 fbxuv : TEXCOORD0;
                float2 fbxuv2 : TEXCOORD1;
            };

            //将顶点着色处理器的数据发送给片元着色器,发送的数据有如下:顶点位置,UV1通道,UV2通道
            struct v2f1
            {
                float4 Myvertex : SV_POSITION;
                float2 MyUV  : TEXCOORD0;
                float2 MyUV2 : TEXCOORD1;
            };
            //从内存中获取主贴图
            uniform sampler2D _MainTex;
            //从内存中获取AO贴图
            uniform sampler2D _AOmap;

            //需要一个内存空间来装UV1和UV2,声明这两个是为了对UV进行位移缩放操作。
            float4 _MainTex_ST;
            float4 _AOmap_ST;

            //下面是顶点着色。 运行之后会将此环节的产物发送给片元着色,送进去的原料参数是appdata,到这里被命名为v
            v2f1 DingDianShader (appdata v)
            {
                //因为结构体中有成员变量,所以需要再次声明成员变量
                v2f1 o;
                //下面开始GPU的顶点着色程序,这里我们并没有复杂的顶点计算,仅仅是直接继承而已,不做加工。
                //UnityObjectToClipPos,固定用法,将物体坐标转成视口裁剪坐标
                o.Myvertex = UnityObjectToClipPos(v.fbxvertex);

                //TRANSFORM_TEX 是专有名词,功能:将贴图谁使用哪层坐标在网格上面进行映射。
                o.MyUV = TRANSFORM_TEX(v.fbxuv, _MainTex);
                o.MyUV2 = TRANSFORM_TEX(v.fbxuv2, _AOmap);

                //最后输出o,然后会被送给片元着色器。
                return o;
            }
            //片元着色器是在最开始CG命令的时候定义的。
            fixed4 PianYuanShader (v2f1 i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex,i.MyUV) * tex2D(_AOmap,i.MyUV2) * 2.0;
                return col;
            }
            ENDCG
        }
    }
}

方案2

Shader "LiShader/mytest 1 "
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _AOmap ("lightmap",2D) = "white"{}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
        //CG语言开始
            CGPROGRAM
            #pragma vertex DingDianShader
            #pragma fragment PianYuanShader
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 fbxvertex : POSITION;
                float2 fbxuv : TEXCOORD0;
                float2 fbxuv2 : TEXCOORD1;
            };
            struct v2f1
            {
                float4 Myvertex : SV_POSITION;
                float2 MyUV  : TEXCOORD0;
                float2 MyUV2 : TEXCOORD1;
            };
            uniform sampler2D _MainTex;
            uniform sampler2D _AOmap;

            //float4 _MainTex_ST;注释掉
            //float4 _AOmap_ST;注释掉

            v2f1 DingDianShader (appdata v)
            {
                v2f1 o;
                o.Myvertex = UnityObjectToClipPos(v.fbxvertex);

                //下面两句不同了
                o.MyUV = v.fbxuv.xy;
                o.MyUV2 = v.fbxuv2.xy;

                return o;
            }
            fixed4 PianYuanShader (v2f1 i) : SV_Target
            {

                fixed4 col = tex2D(_MainTex,i.MyUV) * tex2D(_AOmap,i.MyUV2) * 2.0;

                return col;
            }
            ENDCG
        }
    }
}

配上一些环境效果,气氛就会更好。
这里写图片描述

版权声明:本文为博主原创文章,转载需注明作者。

相关文章推荐

shader学习基础之四(语法规范以及光照模型)

基础篇(四)shader结构解析:Shader “Custom/Diffuse Texture” { ...

shader学习基础之八透明度渲染队列详解

Queue:渲染队列   渲染队列的值越小,渲染级别就越靠前,比如背景层就比如Background和Geometry显示的效果是Geometry在Background之上 值:Background背景...

Unity5.0 Shader 极简入门 (二)

UnityShader的两种编写语法如果想修一张照片 可以用很专业的软件例如“Photoshop”, 当然如果你不会,也可用傻瓜式软件“美图秀秀”,用大神已经做好的特效,简单点一点,照样能修的很棒...
  • leelizc
  • leelizc
  • 2017年06月22日 16:59
  • 216

Unity5.0 Shader 极简入门(一)

这篇文章比较浅显,适合美术人员初学shader阅读,文章为追求通俗易懂,有意避开严谨的学术字眼。在学成后,需学者忘掉该文章的不严谨,切莫追究。 硬件显卡是加工厂,shader是图纸方案,贴图jpg文件...
  • leelizc
  • leelizc
  • 2017年06月16日 18:09
  • 230

Unity Shader入门精要笔记(四):矩阵与空间变换

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。 http://blog.csdn.net/lzhq1982/article/details/73312811 上一篇我们...

Unity Shader入门精要

  • 2017年11月13日 16:58
  • 69.25MB
  • 下载

unity shader入门

  • 2016年07月06日 17:58
  • 780KB
  • 下载

猫都能学会的Unity3D Shader入门指南(二)

猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者...

Unity_shader快速入门~

  • 2015年01月27日 13:28
  • 135KB
  • 下载

Unity Shader入门介绍

  • 2015年01月10日 16:27
  • 583KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity5.0 Shader 极简入门 (四)
举报原因:
原因补充:

(最多只允许输入30个字)