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
        }
    }
}

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

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

Unity5.0 Shader 极简入门 (二)

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

Unity5.0 Shader 极简入门 (五)

屏幕叠贴图特效 准备文件: 一个名为asd的贴图一张, 一个C#特效脚本, 一个简单的特效shader。 C#代码,挂给摄影机的using UnityEngine; using System...
  • leelizc
  • leelizc
  • 2017年09月13日 16:39
  • 335

Unity5.0 Shader 极简入门(一)

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

MongoDB 极简实践入门

1. 为什么用MongoDB? 传统的计算机应用大多使用关系型数据库来存储数据,比如大家可能熟悉的MySql, Sqlite等等,它的特点是数据以表格(table)的形式储存起来的。数据库由一张张排...
  • hsany330
  • hsany330
  • 2016年07月22日 15:20
  • 1122

Golang极简入门教程(三):并发支持

这篇文章主要介绍了Golang极简入门教程(三):并发支持,本文讲解了goroutine线程、channel 操作符等内容,需要的朋友可以参考下 Golang 运行时(runti...
  • kwame211
  • kwame211
  • 2018年01月14日 12:27
  • 74

超全面指南!从零开始教你打造网页设计中的极简风格

什么是极简设计 极简设计,严格上讲不能算作一种视觉风格,而是一种设计哲学。它在保持了基本的骨架内容的基础上,剔除掉多余的元素、装饰、色彩和纹理,是通过不断思考而进行化繁为简的设计过程。这样做的结果是...
  • vanessary2016
  • vanessary2016
  • 2016年04月06日 16:47
  • 546

git极简教程

简介: Git是一个自由和开源的分布式版本控制系统,设计用于处理从小到大型项目的速度和效率。它的一个非常重要的功能便是协同开发。1.安装git下载地址:https://git-scm.com/down...
  • yasin27878
  • yasin27878
  • 2017年02月28日 17:43
  • 89

《Kotlin极简教程》

下载地址
  • qq_34476727
  • qq_34476727
  • 2017年09月29日 11:11
  • 440

读书笔记6《极简》 Joshua Becker 乔舒亚-贝克尔

越简单,越美好
  • m0_37890694
  • m0_37890694
  • 2017年03月16日 16:58
  • 798

谈谈我对极简主义的看法

其实刚开始接触到极简主义是在知乎上,当时看到一张图,是一个答主拍的自己的房间,房间简洁到极致,床,桌子,电脑,衣架,一切显得干净而利落。于是觉得突然就觉得极简主义真他妈好啊,简而有序,带着一种特殊的美...
  • code_vs
  • code_vs
  • 2017年08月09日 23:34
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity5.0 Shader 极简入门 (四)
举报原因:
原因补充:

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