UnityShader实现液体倾倒效果

这篇具有很好参考价值的文章主要介绍了UnityShader实现液体倾倒效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看一下效果图

unity 容器中液面上升效果,Shader,unity

 实现思路:在烧杯倾倒液体时,烧杯内的液体始终不会超过烧杯口的高度,所以我们计算得到这个高度值,然后截取掉超过该高度的像素

首先准备烧杯内液体的模型,挂载一下shader对应的材质球

                                           unity 容器中液面上升效果,Shader,unity

 shader部分:

Shader "Unlit/CullShader"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		Value("ClipValue",Range(-0.1,0.15)) = 0
			   _Color("Color", Color) = (1,1,1,1)
	}

		CGINCLUDE
#include "UnityCG.cginc"
#include "Lighting.cginc"

			struct appdata
		{
			float4 vertex : POSITION;
			float2 uv : TEXCOORD0;
			float3 normal:NORMAL;
		};

		struct v2f
		{
			float2 uv : TEXCOORD0;
			float4 vertex : SV_POSITION;
			float4 pos:TEXCOORD1;
			float3 WorldNor:TEXCOORD2;
			float4 WorldPos:TEXCOORD3;
		};
		fixed4 _Color;
		sampler2D _MainTex;
		float4 _MainTex_ST;
		float Value;
		uniform float objPosY;

		v2f vert(appdata v)
		{
			v2f o;
			o.vertex = UnityObjectToClipPos(v.vertex);
			o.WorldPos = mul(UNITY_MATRIX_M, v.vertex);
			o.uv = TRANSFORM_TEX(v.uv, _MainTex);
			o.WorldNor = normalize(UnityObjectToWorldNormal(v.normal));
			o.pos = v.vertex;
			return o;
		}

		fixed4 fragfront(v2f i) : SV_Target
		{
			if (i.WorldPos.y > Value + objPosY) {
				discard;
			}
			fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
			float3 LightDir = normalize(_WorldSpaceLightPos0.xyz);
			fixed4 col = _Color;
			float3 diffuse = _LightColor0 * col * max(0, dot(i.WorldNor,LightDir) * 0.5 + 0.5);
			fixed3 color = ambient + diffuse;
			return fixed4(color, _Color.a);
		}
			fixed4 fragback(v2f i) : SV_Target
		{
			if (i.WorldPos.y > Value + objPosY) {
				discard;
			}
			 return _Color;
		}
			ENDCG
			SubShader
		{
			Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
				ZWrite On
				Blend SrcAlpha OneMinusSrcAlpha
				LOD 100
				Pass
			{

				cull back//剔除背面,渲染正面
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment fragfront       
				ENDCG
			}
				Pass
			{
			   cull front//剔除正面,渲染背面
			   CGPROGRAM
			   #pragma vertex vert
			   #pragma fragment fragback       
			   ENDCG
			}
		}
}

烧杯内的液体始终相对世界坐标保持水平,因此需要将模型的本地顶点坐标通过UNITY_MATRIX_M矩阵转换到世界坐标,然后水平截取(即使烧杯倾斜,水杯内的液体始终保持世界空间水平)

c#代码部分

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class Test : MonoBehaviour
{
    private Material mat;
    // Start is called before the first frame update
    void OnEnable()
    {
        mat = GetComponent<MeshRenderer>().sharedMaterial;
    }

    // Update is called once per frame
    void Update()
    {
        mat.SetFloat("objPosY", transform.position.y);
    }
}

转换到世界空间的坐标需要以烧杯自身的坐标为基准截取,这样保证无论烧杯在时间空间的什么位置,截取的高度都是相对于烧杯本身的文章来源地址https://www.toymoban.com/news/detail-539579.html

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

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

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

相关文章

  • UnityShader基础案例(四)——模糊效果

            1、高斯模糊                  这个很常见,在后处理一章中有实现,这里不再赘述。还有基于整体的局部模糊,就是屏幕上某一块地方不受模糊处理。                                                     2、径向模糊,含模糊半径                 沿纹理

    2024年02月05日
    浏览(33)
  • UnityShader基础(七)——屏幕后处理效果

            屏幕后处理是基于渲染纹理实现的,通过更改渲染纹理的颜色等等实现某些某些视觉效果。          OnRenderImage函数是MonoBehaviour提供的事件回调函数,不止MonoBehaviour拥有这个函数,Camera也拥有着这个函数,就很怪,而且普通物体上这个回调好像还不生效,官网的说

    2024年02月02日
    浏览(33)
  • UnityShader基础案例(二)——UI流光,扭曲,外边框,波纹效果

    结果:                   实现需要三张图片,一个便是要显示的主纹理,一个是主纹理的透明通道纹理(用于识别边框),一个是流光纹理。         还有一种UI流光是在外面一直转圈的。         不只是局限于UI,场景中的传送门也可以这样做,加个广告牌技术,

    2024年02月02日
    浏览(63)
  • 【Unity】超简单特效 - 液体冒泡泡

    前言: 前面我们学习了气体特效烟雾,那么今天我们来了解一个同样也非常常用且常见的液体特效泡泡。在游戏中我们常常会遇到像沼泽、毒池、沸水、烹饪、药瓶、泥潭等等非会出现液体冒泡的情况,那么这些如果在Unity里用粒子系统如何快速的实现呢。 初步实现: 根据

    2024年02月09日
    浏览(37)
  • 如何在 Unity3D 制作一杯水 LiquidVolume插件 水杯 烧瓶液体

    这款插件功能非常强大,你可以做烧杯装液体,啤酒,鱼缸,甚至是制作一个池塘. Shader的类型与功能都很齐全,基本上可以满足你想要大部分的效果. 这款插件我做了中文翻译,对于英文不是很好的童鞋会有帮助,至少一目了然,大概知道这个参数是做什么的. 参数截图 效果 与原版插件

    2024年02月02日
    浏览(49)
  • UnityShader入门学习(三)——Unity的Shader

    Tags Tags可以写在SubShader的一开始(所有的Pass用),也可以写在Pass块的内部(该Pass用) 渲染设置 同Tags一样也可以写在Pass中或者写在Pass外面(SubShader一开始) Pass介绍 Pass里面可以定义Pass名称 Pass里面的Tags还可以有额外的设置 还有CG语言所写的代码,主要是顶点片元着色器,

    2024年02月16日
    浏览(43)
  • 【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 一个物体为什么看起来是红色的?从物理上解释是因为这个物体

    2024年03月22日
    浏览(52)
  • 【UnityShader入门精要学习笔记】第三章(1)Unity Shader介绍

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 从本章节开始我们要学习Shader相关的知识了,诸位看客可能有的

    2024年02月02日
    浏览(71)
  • 【UnityShader入门精要学习笔记】第六章(2)在Unity中实现光照模型

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 在标准光照模型中国,环境光和自发光的计算是最简单的。而在

    2024年03月28日
    浏览(52)
  • unity实现子弹散射效果和闪电链效果

    实现爆炸散射效果可以按照以下步骤进行: 1.准备子弹模型和爆炸特效模型,可以使用粒子特效或者模型。 2.创建子弹和敌人模型,同时添加刚体组件。 3.创建子弹的脚本,绑定到子弹上。 4.在脚本中,对子弹的 OnTriggerEnter 或 OnCollisionEnter 函数做出响应,检测敌人碰撞事件发

    2024年02月16日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包