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

这篇具有很好参考价值的文章主要介绍了实现草地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中。

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

实现草地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实现偏移

这样就形成了以物体为中心的球形偏移:
实现草地Shader的物体互动效果文章来源地址https://www.toymoban.com/news/detail-730794.html

到了这里,关于实现草地Shader的物体互动效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity shader案例】如何实现一个玻璃效果

      原理:玻璃最大的特点当然就是半透明了,如何在游戏中实现这样的效果呢?我这里总体的思路就是先截取整个场景作为一张纹理,然后把玻璃区域的纹理贴到这个玻璃模型上。 下面看具体实现代码 实现效果如下    更进一步,还可以实现毛玻璃的效果,思路就是用一张

    2024年02月16日
    浏览(34)
  • Unity中Shader实现UI流光效果

    在很多游戏的 UI 中,都有实现 一道光扫过 UI 的效果 Unity中Shader的时间_Time 注意: 因为,这是UGUI的Shader,记着修改渲染顺序为 透明层级 和 混合模式 Tags {“Queue” = “TransParent”} Blend SrcAlpha OneMinusSrcAlpha 代码: 效果: Unity3D Shader系列之UI流光效果 Unity流光shader,无需图片

    2024年02月05日
    浏览(38)
  • 【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年02月16日
    浏览(31)
  • Unity中Shader抓取屏幕并实现扭曲效果(优化)

    对上一篇中实现的shader进行优化 1、定义结构体用于传入顶点坐标系 struct appdata { float4 vertex : POSITION; //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样 float2 uv : TEXCOORD; }; 2、因为UnityObjectToClipPos是从本地空间转换到裁剪空间,但是没有进行透视除法,所以需要对其

    2024年02月03日
    浏览(39)
  • Unity Shader学习记录(11) ——透明效果的实现方式

    1 透明效果的两种方法 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性一一透明度。 当透明度

    2024年02月07日
    浏览(35)
  • 【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年01月21日
    浏览(46)
  • 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    《入门精要》中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是 GrabPass ,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabPass及实现原理做一个更加详细的介绍。 场景物体拜访和贴图完全参考《入门精要》: 以及当前场景

    2024年02月09日
    浏览(33)
  • unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示。中间的数值代表半透明。但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改。 本文介绍透明度测试与透明度混合,前者只能制作全透明效果,后者可制作半透明

    2024年02月14日
    浏览(33)
  • 【实现100个unity特效】shader实现3D物品闪光和描边效果

    线状映射图片 配置,按该shader新增材质 Outline Width控制描边 Line Speed控制闪光速度 当然,还可以修改对应的颜色 效果演示 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的 点赞评论和关注 ,以便我第一时间收到反馈,你的每一次 支持 都是我不断创作的最

    2024年01月25日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包