最新技术
联系我们
主页 > 最新技术 > 最新技术

Unity3D游戏开发从零单排(九),unity3d游戏开发

时间:2019-02-06  编辑:凯发K

Unity3D游戏开发从零单排(九),unity3d游戏开发
提要

今天要学习的是一些Shader 的例子,从简单到难。Let's go.


一大波例子来袭

还是用上一篇用到的工程。点我下载


红色的螃蟹

Test1.shader

Shader "Custom/Test1" {
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float4 color : COLOR;
      };
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = 1;
      }
      ENDCG
    }
    Fallback "Diffuse"
  }

o.Albedo = 1;表示输出颜色是白色,将方向光调成红色,最后经过lambert光照模型计算后,得到




带法线贴图的螃蟹

 Shader "Custom/Test2" {
    Properties {
      _亚虎娱乐官网MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
      };
      sampler2D _MainTex;
      sampler2D _BumpMap;
      void surf (Input IN, inout SurfaceOutput o) {
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }


对比感受一下,左边是不带法线贴图的,右边是带法线贴图的。




从剑灵里面跑出来的螃蟹

先看下啥是剑灵风




感觉就是很多高光有木有(不要瞎瞅,喂!),这还有个专业名词,叫Rim Lighting。我们的螃蟹也可以,哼~

  Shader "Custom/Test3" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
      _RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0)
      _RimPower ("Rim Power", Range(0.5,8.0)) = 3.0
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          float3 viewDir;
      };
      sampler2D _MainTex;
      sampler2D _BumpMap;
      float4 _RimColor;
      float _RimPower;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
          half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
          o.Emission = _RimColor.rgb * pow (rim, _RimPower);
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

渲染结果,(模型精度有点低,凑合着看吧)



原理简单说一下,主要是用来计算边缘光照的,首先通过视线与法线的夹角来找到模型的边缘,然后再根据距离的远近来控制发射光的强度。

half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);


IN.viewDir是当前视角向量,IN.worldNormal是物体的法线。dot是计算视角和法线的点积,等于视角和法线夹角的cos值,Cos的值域是1-0,1-cos就成了0-1,在夹角90度时达到最大值,正好用来模拟侧光的强度(与视角成90度的部分光线最强,就是边缘光了)
把这个值的变化率用一个pow函数(rim的_rimPower次方)进行放大,就能强化边缘发亮的效果。


胖胖的螃蟹

这个效果原理很简单,就是将顶点位置沿着法线方向移动一定的距离。

Shader "Custom/Test4" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _Amount ("Extrusion Amount", Range(-1,1)) = 0.5
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert vertex:vert
      struct Input {
          float2 uv_MainTex;
      };
      float _Amount;
      void vert (inout appdata_full v) {
          v.vertex.xyz += v.normal * _Amount;
      }
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }


确实胖了,但是..怎么画框框的地方怎么有点怪怪的? 其实是mesh的问题,这个从游戏里面提取的模型,三角面可能并不好,比如这个提取的mesh网格九没有封闭。那就换一个好了!

从Dota2的官网下一个旱地神牛的模型下来,导入进来,给他同样的shader,结果如下。



高富帅瞬间变蠢萌娃有木有!0成本把写实风格的模型变成Q版风格。


Vertex modifier function

在surface shader中也可以加入 vetex shader.

方法就是在声明的时候添加一个字段 vertex:xxx,比如

#pragma surface surf Lambert vertex:vert


然后定义好vert函数就可以了。vertex shading的过程会在surface函数之前进行。下面的例子是将法线渲染出来(叠加在原来的颜色上)。

Shader "Custom/test5" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert vertex:vert
      struct Input {
          float2 uv_MainTex;
          float3 customColor;
      };
      void vert (inout appdata_full v, out Input o) {
          UNITY_INITIALIZE_OUTPUT(Input,o);
          o.customColor = abs(v.normal);
      }
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Albedo *= IN.customColor;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

渲染结果


之前的Rim lighting在可以在vertex shading中计算。


Final Color Modifier

这个就很像fregment shader了,属于pipeline的最后一个阶段。

定义的方式和vertex 的类似,

 #pragma surface surf Lambert finalcolor:mycolor

接着定义mycolor函数就可以了。mycolor函数会在surf函数执行之后再执行。

 Shader "Custom/test6" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _ColorTint ("Tint", Color) = (1.0, 0.6, 0.6, 1.0)
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert finalcolor:mycolor
      struct Input {
          float2 uv_MainTex;
      };
      fixed4 _ColorTint;
      void mycolor (Input IN, SurfaceOutput o, inout fixed4 color)
      {
          color *= _ColorTint;
      }
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
           o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

渲染效果


参考

Surface Shader Examples - http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html



问几个对于unity3D开发游戏的问题

我接触过virtools和unity,感觉引擎都是各有优点的,只要精通了都一样,个人感觉unity符合我的风格。不是很华丽,但是所有游戏功能都可以实现。unity商店上有很多的资源可以下载,做2d游戏也很方便。
没事也可以导出自己做的游戏到手机上,自己自恋下,有种满足感。你能把美工和编程结合起来还是很好的,这方面的人才学精的很少的。unity学习起来不是很难,只要多跟着视频完整的做完几个游戏制作的例子就能实现大部分的功能,要想再精通,就要钻研。
unity破解版网上很多,3.0的就足够了,破解版还算稳定吧。偶尔出现问题。
感觉现在笔记本5000左右的都能满足需求,做精模就要用台式机了。
 
新手问点游戏开发顺便问点unity3D的问题

如果你真的想做,就要从零开始,从最基础的开始。现在网上有几个视频说学了U3D俩月就做出看上去不错的,其实都是插件堆出来的,这种方式看似快成,但基本没什么用,只是满足下虚荣心而已,一个只有场景没有交互的东西能算什么呢?
反正我是从零开始的,到现在差不多半年了,感觉最难的是编程,因为以前根本就没接触过,而对于模型材质什么的倒是有点基础。现在的大部分时间都用在了学习编程上,因为这方面是没法绕开的,虽然现在有款插件playMaker说是可以没有编程经验就可以做游戏,但感觉并不顺手,不过如果不想学编程的话可以试试
而对于编程,unity常用的是Javascript和C#,虽然说javascript易学,但Unity的javascript并不是标准的,而是其特有的UnityScript,但现在并没有系统的UnityScript教材,所以在我看来并不容易学。但我现在还是在啃UnityScript,因为一开始就是学的这个,想学通学精再换C#。如果你想学的话,建议C#,但我不知道unity的c#和标准c#是不是一样,这方面你可以再做决定
对于untiy是不是适于个人开发,可以看下 康拓耶夫 的视频,里面有unity和其他几个引擎的对比,其中就有大名鼎鼎的虚幻等引擎
你说用两年做出来,感觉还是靠谱的,但第一年还是啃基础吧,而即使基础打好了,也不要急于做大型的游戏,做些小游戏试手。
而对于是不是能做出来,我用unity的原因之一是魔兽争霸的地图编辑器,虽然我没编过地图,但既然编辑器能做出dota那样经典的东西,unity难道就不行吗?顺道说一句,知道dota但并没玩过,澄海倒是玩了一段时间,相对于dota,我更喜欢比如浩方平台上的其他魔兽小游戏,比如前段时间较火的路人三国,还有乏人问津的兔羊之战等等。而魔兽争霸战役也有高水平的,比如血色使命,可称国内最高,而开放模式的逆流之战,可以当做网游来玩

此外,并不是所有的东西都要自己做,比如模型,在Outfit7的开发中,用到的第一个模型是从某网站买的。而如果某个插件很利于游戏制作,不妨使用,但最开始还是建议从基础开始,插件是用来提高效率的
现在国内较活跃的论坛是 unity圣典game.ceeger.com/forum/,前几天把所有资源设为免费下载了,但昨天115下载出了问题,很多东西不能下载了,残念
其他的比如天地会、cocochina等都是子版块,活跃度不是很高,unity3d8也不错,但很多资源需要较高级别才能下载
对于人物是2D还是3D,只是一种变换,所谓2D,是播放渲染好的一系列图片,这些图片大多是用3D模型渲染的,但unity并不适于做2D,不过有相关才插件做

因为是自学,也没什么系统的东西告诉你,只能说,这是条很艰难的路,做了决定就去做吧!
说的有些乱,呵呵
 

http://www.bkjia.com/Androidjc/885833.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/885833.htmlTechArticleUnity3D游戏开发从零单排(九),unity3d游戏开发 提要 今天要学习的是一些Shader 的例子,从简单到难。Let's go. 一大波例子来袭 还是用上一篇用...

本文源自: AG游戏网站

Copyright © 2005-2016 http://www.firebugkc.com AG游戏网站_亚洲最佳百家乐游戏平台_AG环亚集团_网易体育版权所有 AG游戏网站_亚洲最佳百家乐游戏平台_AG环亚集团_网易体育