shader从入门到精通(连载三)

shader从入门到精通(连载三)

大家好,我是北京菜鸟在线的unity3d 高级讲师,范老师,今天给大家继续分享我的笔记 shader

继续上一章:

上面是一个最简单的着色器。

注意有以下几部分组成:

(1):ShaderLab 语法
  (2):CG 语法
(3):两个#pragma, 一个#include
(4):定义一个变量,_MainTex和上面的变量一样,类型也一样
(5):一个结构体
(6):顶点函数
(7):片段函数
(8):最后一个 FallBack

几个开概念: 顶点,法线,切线

法线:它是垂直于一个面的顶点


关于 #include"UnityCG.cginc"库文件


打开 库文件:如下图


(2)当一个广告牌上,有好几个广告,滚动,一次只显示一个,下面,我们书写一个 shader 来制作广告牌效果。 新创建一个 shader 然后把里面的东西都删除掉,如下:然后,开始添加代码

Shader "Custom/NewShader" {
Properties {

   }
   SubShader {

   }
   FallBack "Diffuse"

}
具体更改如下::
Shader "myShaderMyShaderMyShader/NewShader" { // 菜单的路径
Properties {
_MainTex("MainTex", 2D) = "white"{}
}
SubShader {
Tags{"RenderType" = "Opaque"} // Opaque : 是不透明的 Transparent: 是透明的 标签
LOD 200 // 细节等级,这是可以调的,如果后面小于这个200 的话,那么,这个shader将不在显示,一般我们都写200
pass{ // pass 通道
CGPROGRAM // CG 语法
#pragma vertex vert // 声名一个顶点函数 函数名 vert // 顶点函数是处|理物体的形状
#pragma fragment frag // 声名一个片段函数 函数名 frag 变量是自己写的,可以随便写 // 片段函数是处|理物体的颜色的

     #include"UnityCG.cginc"      // 添加库文件t,这个库文件,是你安装工程中的
     // 需要说明的是:库文件里,这个appdata_base是游戏对象上的Mesh Filter传递过来的,mesh Filter包含了各信息,下面的v2f也是自己起的名字
     struct v2f{                  //我们来写一个结构1体,来接收上面写的库文件t的那几个数据信息(顶点,法线,贴图)
      float4 ver : POSITION;    // 物体的顶点数据      // 在库文件里,把这三条复制过来。需要注意的是,变量的名字,尽量不要一样所以,我们要更改一下。把三个变量的后半截都删除掉
                   //float3 nor : NORMAL;       // 物体的法线数y据Y
                   float4 tex : TEXCOORD0;   // 物体的贴图数y据Y
     };  // 注意这里是必须要分号结束的
     // 创建一个顶点函数
     v2f vert(appdata_base v)
     {
          v2f o;
          // 让物体显示在屏幕上面的一条很神秘的代码。
          o.ver = mul(UNITY_MATRIX_MVP, v.vertex);
          o.tex = v.texcoord;  // 得到 appdata_base里面的贴图信息,这texcoord是结构体里面的变量
          return o;  // 返回到片段函数里面
     }
 // 顶点到片段
     fixed4 frag(v2f IN) : COLOR    // color是颜色属性,你可以看做像是 js 里,color 声名了一个变量。
     {
          return fixed4(1,0,0,1);  // 返回了一个红色
     }

     ENDCG
   }
}
FallBack "Diffuse"  // 最后的回调

}

把我们写的 shader 添加到Cube上,我们可以看到,这个Cube 就变成了红色。如下图:

那么,我们不想它返回一个颜色,我们想把它返回一个贴图,要怎么办呢? 我们需要对我们的shander 做出如下红色的代码更改:

Shader "myShaderMyShaderMyShader/NewShader" { // 菜单的路径
Properties {
_MainTex("MainTex", 2D) = "white"{}
}
SubShader {
Tags{"RenderType" = "Opaque"} // Opaque : 是不透明的 Transparent: 是透明的 标签
LOD 200 // 细节等级,这是可以调的,如果后面小于这个200 的话,那么,这个shader将不在显示,一般我们都写200
// cull back // 背面删除,意思就是当我们把这个shader放在plan面板上的时候,正面可以看到,背面是看不到的。
// cull front // 正面删除
// cull off // 两面都不删除
pass{ // pass 通道
CGPROGRAM // CG 语法
#pragma vertex vert // 声名一个顶点函数 函数名 vert // 顶点函数是处|理物体的形状
#pragma fragment frag // 声名一个片段函数 函数名 frag 变量是自己写的,可以随便写 // 片段函数是处|理物体的颜色的

     #include"UnityCG.cginc"      // 添加库文件t,这个库文件,是你安装工程中的
     sampler2D _MainTex;   
     // 需要说明的是:库文件里,这个appdata_base是游戏对象上的Mesh Filter传递过来的,mesh Filter包含了各信息,下面的v2f也是自己起的名字
     struct v2f{                  //我们来写一个结构1体,来接收上面写的库文件t的那几个数据信息(顶点,法线,贴图)
      float4 ver : POSITION;    // 物体的顶点数据      // 在库文件里,把这三条复制过来。需要注意的是,变量的名字,尽量不要一样所以,我们要更改一下。把三个变量的后半截都删除掉
                   //float3 nor : NORMAL;       // 物体的法线数y据Y
                   float4 tex : TEXCOORD0;   // 物体的贴图数y据Y
     };  // 注意这里是必须要分号结束的
     // 创建一个顶点函数
     v2f vert(appdata_base v)
     {
          v2f o;
          // 让物体显示在屏幕上面的一条很神秘的代码。
          o.ver = mul(UNITY_MATRIX_MVP, v.vertex);
          o.tex = v.texcoord;  // 得到 appdata_base里面的贴图信息,这texcoord是结构体里面的变量
          return o;  // 返回到片段函数里面
     }
     fixed4 frag(v2f IN) : COLOR    // color是颜色属性,你可以看做像是 js 里,color 声名了一个变量。
     {
         IN.tex.x  /= 5;  // 把这个贴图分成五份
       //  IN.tex.x  +=  0.20 ;  // 相当于把这个贴图只显示了五分之一。
         IN.tex.x +=  _Time.x;  // 运行程序的时候,就可以看到纹理贴图在缓慢的移动了。
         return tex2D(_MainTex, IN.tex);  // 返回纹理贴图
     }

     ENDCG
   }
}
FallBack "Diffuse"  // 最后的回调

}

回去unity3d 我们发现,游戏对象的纹理已经发生了改变



运行程序,就可以看到广告牌在移动了,每次显示一个广告。
需要注意的是:顶点函数是改变物体的形状。 片段函数是改变物体的颜色。

下一章,我们将用shader制作一个红旗飘扬的效果

《待续》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • <转>我也忘了转自哪里,抱歉,感谢原作者 什么是Shader Shader(着色器)是一段能够针对3D对象进行操作...
    星易乾川阅读 5,577评论 1 16
  • 转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shad...
    游戏开发小Y阅读 3,323评论 0 4
  • 转自:http://m.blog.csdn.net/puppet_master/article/details/5...
    树上的cat_ee3c阅读 3,828评论 1 6
  • 动机自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入...
    JumboWu阅读 2,109评论 0 24
  • 阿策看着夕阳,今天阿晴对她表白,阿策心里很暗喜,阿晴长的还不错,我先用一用。 阿晴又在傻笑,母亲问她怎么回事,她也...
    秦楚_8058阅读 239评论 0 0