我跟著教程:https://zhuanlan.zhihu.com/p/433385999 用Unity Shader實現(xiàn)了草地效果。
接下來我分享一下我在這篇文章的基礎(chǔ)上實現(xiàn)簡單的草地互動效果的經(jīng)驗。
1、從腳本中傳入?yún)?shù)
如果需要實現(xiàn)互動效果,需要實現(xiàn)腳本向shader的傳遞參數(shù)。
腳本使用下面的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//將這個組件拖給物體可以使其與草地互動
//互動范圍是物體postion為中心的球體
public class MeshInteractWithGrass : MonoBehaviour
{
void Update()
{
Shader.SetGlobalVector("_PositionMoving", transform.position);
}
}
在場景中創(chuàng)建一個膠囊體,掛上這個腳本。
2、參數(shù)傳入Shader并驗證
在最初尋找傳參的方法的時候,如何驗證shader確實收到了參數(shù)是一個很重要的問題。
首先在shader 的CG代碼段添加變量:
Vector _PositionMoving;//由腳本傳入
我開始的時候在Shader的Properties中添加了_PositionMoving("Pos", Vector) = (0, 0, 0, 0)變量,但是我發(fā)現(xiàn)這樣似乎無法正確接收到變量。
所以腳本中使用Shader.SetGlobalVector傳入數(shù)據(jù)的時候,shader中不要再添加Properties了。
直接在CG代碼段里面添加變量就好。
然后找到片元著色器 frag,把 frag 內(nèi)部其他代碼都注釋掉,添加下面的代碼:
//測試物體互動,測試數(shù)據(jù)是否傳進去了
return(_PositionMoving);
隨后運行游戲。移動物體,查看草葉的顏色是否有變化。
如果有變化,說明物體的位置數(shù)據(jù)通過腳本成功的傳進了Shader中。
3、實現(xiàn)草葉頂點偏轉(zhuǎn)
3.1、原理
請先根據(jù)文章開頭的文章完成草地的實現(xiàn)
可以在生成草葉頂點的時候,對頂點施加一個用向量控制的偏移,來實現(xiàn)草葉偏轉(zhuǎn)而草根不動。
教程BIRP - Grass Geometry Shader with Interactivity | Patreon中有簡單提到實現(xiàn)原理,但沒有說清楚細節(jié)。
在Shader的Properties中添加下面兩個變量,用于控制互動范圍和強度:
//其他物體與草的互動范圍
_Radius("Radius", Float) = 1
//互動強度
_Strength("Strength", Float) = 1
在CG代碼段添加:
//物體互動
float _Radius;
float _Strength;
這個教程的草地實現(xiàn)的時候,在幾何著色器使用了一個循環(huán)用于細分草葉頂點。生成頂點的時候使用了函數(shù)GenerateGrassVertex。我們接下來的改動都在這個函數(shù)中進行。
在這個函數(shù)localPosition的定義后添加下面的代碼:
//計算物體偏移
float3 ObjectPos = mul(unity_WorldToObject, _PositionMoving.xyz);
float3 dis = distance(ObjectPos, localPosition);
float3 radius = 1 - saturate(dis / _Radius);
float3 sphereVector = localPosition - ObjectPos;
sphereVector *= radius;
sphereVector = sphereVector.xyz * _Strength;
localPosition += sphereVector;
我嘗試在模型空間下計算偏移。文章來源:http://www.zghlxwxcb.cn/news/detail-730794.html
- 首先將傳入的物體坐標轉(zhuǎn)換到模型空間下。
- 然后計算物體與新生成的頂點的距離。
- 然后計算距離與_Radius變量之間的比例
- 用頂點坐標向量減去物體坐標,得到從物體位置指向草葉頂點位置的向量sphereVector
- sphereVector乘radius,實現(xiàn)不同距離有不同的向量大小
- sphereVector乘_Strength調(diào)整偏移力度大小
- localPosition加上得到的向量sphereVector實現(xiàn)偏移
這樣就形成了以物體為中心的球形偏移:文章來源地址http://www.zghlxwxcb.cn/news/detail-730794.html
到了這里,關(guān)于實現(xiàn)草地Shader的物體互動效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!