当前位置: 首页 >  在线学习 >  实现草地Shader的物体互动效果

实现草地Shader的物体互动效果

导读:我跟着教程:https://zhuanlan.zhihu.com/p/433385999 用Unity Shader实现了草地效果。.接下来我分享一下我在这篇文章的基础上实现简单的草地互动效果的经验。.1、从脚本中传入参数.如果需要实现互动效果,需要实现脚本向shader的传递参

我跟着教程:https://zhuanlan.zhihu.com/p/433385999 用Unity Shader实现了草地效果。

接下来我分享一下我在这篇文章的基础上实现简单的草地互动效果的经验。

1、从脚本中传入参数

如果需要实现互动效果,需要实现脚本向shader的传递参数。
脚本使用下面的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//将这个组件拖给物体可以使其与草地互动
//互动范围是物体postion为中心的球体
public class MeshInteractWithGrass : MonoBehaviour
{
    void Update()
    {
        Shader.SetGlobalVector("_PositionMoving", transform.position);
    }
}

在场景中创建一个胶囊体,挂上这个脚本。

2、参数传入Shader并验证

在最初寻找传参的方法的时候,如何验证shader确实收到了参数是一个很重要的问题。

首先在shader 的CG代码段添加变量:

Vector _PositionMoving;//由脚本传入

我开始的时候在Shader的Properties中添加了_PositionMoving(“Pos”, Vector) = (0, 0, 0, 0)变量,但是我发现这样似乎无法正确接收到变量。
所以脚本中使用Shader.SetGlobalVector传入数据的时候,shader中不要再添加Properties了。
直接在CG代码段里面添加变量就好。

然后找到片元着色器 frag,把 frag 内部其他代码都注释掉,添加下面的代码:

//测试物体互动,测试数据是否传进去了
return(_PositionMoving);

随后运行游戏。移动物体,查看草叶的颜色是否有变化。
如果有变化,说明物体的位置数据通过脚本成功的传进了Shader中。

3、实现草叶顶点偏转

3.1、原理

请先根据文章开头的文章完成草地的实现

可以在生成草叶顶点的时候,对顶点施加一个用向量控制的偏移,来实现草叶偏转而草根不动。

教程BIRP - Grass Geometry Shader with Interactivity | Patreon中有简单提到实现原理,但没有说清楚细节。

在Shader的Properties中添加下面两个变量,用于控制互动范围和强度:

//其他物体与草的互动范围
_Radius("Radius", Float) = 1
//互动强度
_Strength("Strength", Float) = 1

在CG代码段添加:

//物体互动
float _Radius;
float _Strength;

这个教程的草地实现的时候,在几何着色器使用了一个循环用于细分草叶顶点。生成顶点的时候使用了函数GenerateGrassVertex。我们接下来的改动都在这个函数中进行。

在这个函数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;

我尝试在模型空间下计算偏移。

  • 首先将传入的物体坐标转换到模型空间下。
  • 然后计算物体与新生成的顶点的距离。
  • 然后计算距离与_Radius变量之间的比例
  • 用顶点坐标向量减去物体坐标,得到从物体位置指向草叶顶点位置的向量sphereVector
  • sphereVector乘radius,实现不同距离有不同的向量大小
  • sphereVector乘_Strength调整偏移力度大小
  • localPosition加上得到的向量sphereVector实现偏移

这样就形成了以物体为中心的球形偏移:

内容
  • 计算机网络概念汇总
    计算机网络概念汇总
    2023-12-05
    1. 模型结构.五层模型 :.应用层、传输层、网络层、数据链路层、物理层。.应用层 :为应用程序提供交互服务。在互联网中
  • UE开发使用Rider时缓存干爆C盘的解决方案
    UE开发使用Rider时缓存干爆
    2023-12-03
    我们在使用Rider开发UE时,Ride会为每一个项目创建一个解决方案缓存,如果开几个新项目写测试demo,我们的C盘会
  • Unity3D 横板跳跃游戏半成品demo源代码
    Unity3D 横板跳跃游戏半成
    2023-12-08
    项目介绍:.基于B站的 Unity3D新手教程 进行学习制作,但视频中的做法有很多BUG,此demo是经过优化,几乎修复
  • 数据分析师如何用SQL解决业务问题?
    数据分析师如何用SQL解决业务问
    2023-12-03
    本文来自问答。.提问:数据分析人员需要掌握sql到什么程度?.请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?
  • Unity 中的存档系统(本地存档)
    Unity 中的存档系统(本地存
    2023-12-09
    思想.在游戏过程中,玩家的背包、登录、人物系统都与数据息息相关,无论是一开始就设定好的默认数据,还是可以动态存取的数据,
  • unity 实现自定义class深度拷贝 deep copy 深度复制 引用类型复制
    unity 实现自定义class
    2023-12-09
    气死我了,搜半天没有,全让序列化再反序列化,又不方便又不美观。结果自己试着一写就通,两行完事。.首先先安装Newtons