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 极简入门(一)

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

Unity5.0 Shader 极简入门 (二)

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Shader简单入门

原文链接:http://blog.csdn.net/a351945755/article/details/36876243 自己使用unity3d也有一段时间了,但是很多时候是流于表面,更多地是把这个...

MongoDB 极简实践入门

MongoDB 极简实践入门 1. 为什么用MongoDB? 传统的计算机应用大多使用关系型数据库来存储数据,比如大家可能熟悉的MySql, Sqlite等等,它的特点是数据以表格(table...

OpenGL--shader入门

理论基础 实例代码 //源程序 #include "GLTools.h" #include "GLShaderManager.h" #ifdef __APPLE__ #inclu...

Shader 入门(二)

渲染管线的理解:最近在学习Unity Shader编程,为了加深对编程过程的理解,所以将学习过程中的一些学习内容记录下来,方便以后进行再次阅读。不说废话了,直奔今天的主题。了解管线之后,能让人了解3D...

Unity3D Shader 入门

转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色...

Unity Shader入门

1、UnityShader分为三部分:       1、固定管线着色器       2、可编程管线着色器               1、表面着色器(Surface...

unity shader入门

Shader其实就是根据你的输入,进行计算转换,再次输出,渲染绘制 1.Shader 结构: Shader "shader名称" {     //属性     Propertie...

Unity3D Shader 入门

Shader的种类Unity Shader 是将传统的硬件Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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