當前位置:
首頁 >
Unity草地/草坪案例分享(完整代码)
發布時間:2024/8/1
73
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Unity草地/草坪案例分享(完整代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
老規矩先上圖
最近又開始繼續操刀我的新獨立游戲啦,網上看了很多草地的案例受益匪淺。但是嘛最近還是選擇用自己的方式去實現。
主要是因為這種方式可以更好的貼合我前后的需求。還有很多有意思的技術點,有時間一點點拿來和大家一起分享吧。
這次先來說說草地的實現方式:
由于草地需要貼合模型表面,所以這里是從附著的模型表面開始的:
一、循環Mesh三角型數值,以三角型為單位記錄一組數據,內容為三個頂點位置及其法線信息。
代碼如下:
以上即是每組數據記錄了三個點頂及其法線的信息。
值得一提的由于所在位置和法線這不相同,這里用的是頂點沿法線偏移出去,再隨機一定位置后再反射回來找位置的方式找到基點。
二、位置和信息找完后,然后就是創建Mesh將每個草的信息寫進去,由于數量可能非常多,所以可能需要分開幾個Mesh,代碼如下:
這里重點講每個單草是怎么生成的,如圖所示一共四個點頂點型的三個倒三角面,重點關注下UV,上面的X分別為0-0.5和0.5-1的范圍:
代碼如下:
下面是材質部分,使用透明度測試的方式裁剪處草的形狀,再用擺動上端UV做出風吹的效果,上代碼:
Shader "Custom/Glass" {Properties{[Header(Ground_Base)]_MainTex("RGB:基礎色 A:透明通道",2D) = "white"{}_MainCol("基本色",Color) = (0.5,0.5,0.5,1.0)_Speed("速度 ",Range(0,10)) = 5_Scope("幅度 ",Range(0,1)) = 0.3}SubShader{Tags{"RenderType" = "Opaque"}Pass{Tags{"LightMode" = "ForwardBase"}//ZWrite offCull offCGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"#include "UnityCG.cginc"#pragma target 3.0//地面參數uniform sampler2D _MainTex; uniform half4 _MainTex_ST;uniform half3 _MainCol;uniform half _Speed;uniform fixed _Scope;//輸入結構struct a2v {float4 vertex: POSITION; //頂點信息float2 uv0: TEXCOORD0; //UV信息};//輸出結構struct v2f {float4 pos:SV_POSITION; //屏幕定點位置float2 uv0:TEXCOORD0; //UV};v2f vert(a2v v) {v2f o; //新輸出結構o.pos = UnityObjectToClipPos(v.vertex); //頂點位置 OS>CSo.uv0 = v.uv0 *_MainTex_ST.xy + _MainTex_ST.zw; //傳弟UVo.uv0.x = o.uv0.x + (sin(_Time.x*_Speed)*_Scope * o.uv0.y); //擺動return o;}float4 frag(v2f i) :SV_TARGET{//紋理采樣half4 var_MainTex = tex2D(_MainTex, i.uv0);//裁剪clip(var_MainTex.a - 0.1);//最終混合half3 finalRGB = var_MainTex * _MainCol;return half4(finalRGB ,1);}ENDCG }草地的貼圖大概是這樣:
中間有個間隔,因為要換面了…嘻嘻.
這或許不是個高明的方式,但是一個符合我項目需求的方式,分享給大家希望對大家有幫助,謝謝。
總結
以上是生活随笔為你收集整理的Unity草地/草坪案例分享(完整代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何高效完成英文文献翻译
- 下一篇: MicroSoft官方——Sql Ser