水瓶效果制作


前言

提示:这里可以添加本文要记录的大概内容:

本次分享主要为水瓶效果,思路借鉴于https://www.patreon.com/posts/quick-game-art-18245226 该链接,不过部分内容较难理解,所以打算使用自己的思路实现一下


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现效果

在这里插入图片描述

效果分析

1.胶囊体模型,可修改shader属性修改水瓶水面高度
2.水面厚度,可修改shader属性修改水平厚度
3.水瓶面颜色,可修改shader属性修改水平面颜色
4.水瓶满足物理效果,可左右摇曳,上下反转
5.菲涅尔边缘效果,加强层级
6.边缘拓展,增加形体

实现流程

1.边缘拓展,增加形体

首先是边缘效果,为了突出水平的的形状,我们的一个Pass用于边缘效果实现。这里直接使用了顶点沿法线方向拓展,并且追加了菲尼尔效果,作为我们第一个Pass这里关闭深度写入,避免第二个Pass深度测试失败。以下是实现效果。
在这里插入图片描述

边缘效果代码如下:
```cPass{ZWrite Off Cull BackBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 world_pos : TEXCOORD1  ;float3 world_normal:TEXCOORD2 ;};float _EdgePower;float _DimPow;v2f vert (appdata v){v2f o;v.vertex.xyz += v.normal * _EdgePower;o.vertex = UnityObjectToClipPos(v.vertex);o.world_pos = mul(unity_ObjectToWorld, v.vertex);o.world_normal = UnityObjectToWorldNormal(v.normal);return o;}fixed4 frag (v2f i, fixed facing : VFACE ) : SV_Target{float3 world_view_dir = normalize(UnityWorldSpaceViewDir(i.world_pos));float rim = 1 - pow(saturate(dot(i.world_normal, world_view_dir)), _DimPow);return fixed4(1,1,1, rim);}ENDCG}

胶囊体模型,可修改shader属性修改水瓶水面高度

由于我们的水平面要要适应水瓶旋转的各个角度保持平衡,所以我们这里需要使用世界空间来计算,又避免世界空间影响水平高度计算,我们需要将对象空间的中心点切换到世界空间,再用世界空间的中心位置减去世界空间的顶点位置,这样既不受世界空间的影响,也根据差值计算水平高度。得到的差值再减去一个控制变量,得到我们alpha值,我们就是通过修改透明通道的值来做剔除效果,最后Pass标记上当然要加上 AlphaToMask On 剔除透明部分。在上面的链接里面我看到他直接用object->world的矩阵乘以对象空间顶点的xyz,这里我是不太理解的,object->world矩阵不是一个4x4的矩阵,怎么能乘以一个3维坐标呢。而且算出来的坐标也不受世界空间影响,我是觉得很奇怪的,有谁知道可以跟我讲一下。
在这里插入图片描述
边缘效果代码如下:

    fixed4 frag (v2f i, fixed facing : VFACE ) : SV_Target{                float4 world_center = mul(unity_ObjectToWorld, float4(0, 0, 0,  1));float4 world_pos = i.world_pos;float4 cache_output1 = world_center - world_pos;float cache_output2 = 1 - _Height;float mulTime2 = _Time.y * _Speed;           float alpha = clamp((cache_output1.y - cache_output2 )/ _Falloff, 0 , 1 ) ;return fixed4(_Color.rgb , alpha);}

水面厚度,可修改shader属性修改水平厚度

水平厚度我们直接调用step()函数,根据以上计算的差值,我们再减去一个水平厚度控制变量,得到一个非0即1的结果,再根据这个结果在Color1,以及Color之间做渐变。step()和smoothstep()这个函数我觉得在做渐变时候很管用,一个是无过渡式渐变,一个是过渡式渐变。
在这里插入图片描述
边缘效果代码如下:

    float4 world_center = mul(unity_ObjectToWorld, float4(0, 0, 0,  1));float4 world_pos = i.world_pos;float4 cache_output1 = world_center - world_pos;float cache_output2 = 1 - _Height;float alpha = clamp((cache_output1.y - cache_output2 )/ _Falloff, 0 , 1 ) ;float cache_output3 = step(cache_output1.y - _Width, cache_output2);float4 cache_output4 = lerp(_Color, _Color3, cache_output3);               return fixed4(cache_output4.rgb , alpha);

水瓶面颜色,可修改shader属性修改水平面颜色,菲涅尔边缘效果,加强层级

水平面颜色我们使用了fixed facing : VFACE 字段,该字段表示被渲染的面是否朝向摄像机,用于片段着色器。同时我们也追加菲尼尔效果

水瓶满足物理效果,可左右摇曳,上下反转

这个的实现方式我主要借鉴链接里的思路。首先左右摇曳,我们需要得到速度以及力的衰弱权重。我这里做了简化版。链接还考虑了旋转值,我这边就直接考量速度与衰弱。速度就直接拿上一帧的坐标减去当前帧的坐标得到速度,衰弱就根据时间系数在速度值与0之间做差值得到衰弱权重。并将其整合成_WobbleX,_WobbleZ两个方向上的权重传入shader计算。
在这里插入图片描述

以下是完整代码

shader部分

Shader "Unlit/Test14"
{Properties{_Height("Height", Float) = 0.1_Falloff("Falloff", Float) = 0.1_Color("Color", Color) = (1, 0, 0, 0)_Color2("Color", Color) = (0, 0, 0, 0)_Color3("Color", Color) = (0, 1, 0, 0)_Speed("Speed", Float) = 0_Size("Size", Float) = 0.1_EdgePower("EdgePower", Range(0, 1)) = 0.1_DimPow("DimPower", Float) = 1_RimColor("RimColor", Color) = (1, 1, 1, 1)[HideInInspector] _WobbleX ("WobbleX", Range(-1,1)) = 0.0[HideInInspector] _WobbleZ ("WobbleZ", Range(-1,1)) = 0.0}SubShader{Tags { "RenderType"="Transparent" "Queue"="Transparent"}LOD 100Pass{ZWrite Off Cull BackBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 world_pos : TEXCOORD1  ;float3 world_normal:TEXCOORD2 ;};float _EdgePower;float _DimPow;v2f vert (appdata v){v2f o;v.vertex.xyz += v.normal * _EdgePower;o.vertex = UnityObjectToClipPos(v.vertex);o.world_pos = mul(unity_ObjectToWorld, v.vertex);o.world_normal = UnityObjectToWorldNormal(v.normal);return o;}fixed4 frag (v2f i, fixed facing : VFACE ) : SV_Target{float3 world_view_dir = normalize(UnityWorldSpaceViewDir(i.world_pos));float rim = 1 - pow(saturate(dot(i.world_normal, world_view_dir)), _DimPow);return fixed4(1,1,1, rim);}ENDCG}Pass{AlphaToMask OnCull OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float4 world_pos : TEXCOORD1  ;float3 world_normal: TEXCOORD2 ;};float _Height;float _Falloff;float4 _Color;float4 _Color2;float4 _Color3;float _WobbleX, _WobbleZ;float _Speed;float4 _RimColor;float _Size;float _DimPow;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.world_pos = mul(unity_ObjectToWorld, v.vertex);o.world_normal = UnityObjectToWorldNormal(v.normal);return o;}fixed4 frag (v2f i, fixed facing : VFACE ) : SV_Target{float3 world_view_dir = normalize(UnityWorldSpaceViewDir(i.world_pos));float rim = 1 - pow(saturate(dot(i.world_normal, world_view_dir)), _DimPow);facing = facing * 0.5 + 0.5;float4 rim_color = rim * _RimColor * facing;float4 world_center = mul(unity_ObjectToWorld, float4(0, 0, 0,  1));float4 world_pos = i.world_pos;float4 cache_output1 = world_center - world_pos;float cache_output2 = 1 - _Height;float mulTime2 = _Time.y * _Speed;float cache_output_3 = (( _WobbleX * cache_output1.x * sin( mulTime2 ) * _Size ) +( _WobbleZ * cache_output1.z * sin( mulTime2 ) * _Size ) + cache_output1.y);float alpha = clamp((cache_output_3 - cache_output2 )/ _Falloff, 0 , 1 ) ;float cache_output3 = step(cache_output_3 - 0.1, cache_output2);float4 cache_output4 = lerp(_Color + rim_color, _Color3, cache_output3);float4 finalcolor = lerp(_Color2 , cache_output4, facing);return fixed4(finalcolor.rgb + rim_color.rgb , alpha);}ENDCG}}
}

cs部分

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyWobble : MonoBehaviour
{Renderer rend;Vector3 lastPos;Vector3 velocity;public float MaxWobble = 0.03f;public float WobbleSpeed = 1f;public float Recovery = 1f;float wobbleAmountX;float wobbleAmountZ;float wobbleAmountToAddX;float wobbleAmountToAddZ;float pulse;float time = 0.5f;// Start is called before the first frame updatevoid Start(){rend = GetComponent<Renderer>();}// Update is called once per framevoid Update(){time += Time.deltaTime;// decrease wobble over timewobbleAmountToAddX = Mathf.Lerp(wobbleAmountToAddX, 0, Time.deltaTime * (Recovery));wobbleAmountToAddZ = Mathf.Lerp(wobbleAmountToAddZ, 0, Time.deltaTime * (Recovery));// make a sine wave of the decreasing wobble//pulse = 2 * Mathf.PI * WobbleSpeed;//wobbleAmountX = wobbleAmountToAddX * Mathf.Sin(pulse * time);//wobbleAmountZ = wobbleAmountToAddZ * Mathf.Sin(pulse * time);// send it to the shaderrend.material.SetFloat("_WobbleX", wobbleAmountToAddX);rend.material.SetFloat("_WobbleZ", wobbleAmountToAddZ);//print(wobbleAmountX + "--------------" +wobbleAmountZ);// velocityvelocity = (lastPos - transform.position) / Time.deltaTime;print(velocity);// add clamped velocity to wobblewobbleAmountToAddX += Mathf.Clamp((velocity.x) * MaxWobble, -MaxWobble, MaxWobble);wobbleAmountToAddZ += Mathf.Clamp((velocity.z ) * MaxWobble, -MaxWobble, MaxWobble);// keep last positionlastPos = transform.position;}
}

总结

以上就是水瓶制作的流程,欢迎讨论。特别是在上面的链接里面直接用object->world的矩阵乘以对象空间顶点的xyz,这里我是不太理解的,object->world矩阵不是一个4x4的矩阵,怎么能乘以一个3维坐标呢。而且算出来的坐标也不受世界空间影响,而且刚好能用,神奇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50210.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记:深度学习进阶-自然语言处理(俗称鱼书二)

文章目录 前言一、神经网络的复习二、自然语言和单词的分布式表示2.1什么是自然语言处理2.2同义词词典2.3基于计数的方法2.3.1基于python的语料库的预处理2.3.2单词的分布式表示2.3.3分布式假设2.3.4共现矩阵2.3.5向量间的相似度2.3.6相似单词的排序 2.4基于计数的方法的改进2.…

隐私计算将改变金融行业的游戏规则?

开放隐私计算 01 背景 2月底&#xff0c;相关部门印发《数字中国建设整体布局规划》提出&#xff0c;到2025年&#xff0c;基本形成横向打通、纵向贯通、协调有力的一体化推进格局&#xff0c;数字中国建设取得重要进展&#xff1b;到2035年&#xff0c;数字化发展水平进入世界…

【ChatGLM】使用ChatGLM-6B-INT4模型进行P-Tunning训练记录及参数讲解

文章目录 模型训练步骤参数含义名词解释欠拟合泛化能力收敛性梯度爆炸 初步结论 小结 模型训练 首先说明一下训练的目的&#xff1a;提供本地问答知识文件&#xff0c;训练之后可以按接近原文语义进行回答&#xff0c;类似一个问答机器人。 步骤 安装微调需要的依赖&#xf…

几个潜在的AI科研助手

最近看到一个新闻说ChatGPT被某科研文章列为作者之一。以自然语言处理和深度学习为基础的人工智能在语言修改润色和翻译方面表现优异&#xff0c;似乎还将改变一些传统的论文阅读和写作方式。本文记录几个最近了解到的几个工具。 Scispace 地址&#xff1a;https://typeset.io/…

客户体验词汇表:需要了解的最重要的术语

无论如何&#xff0c;当我们说客户体验时&#xff0c;是什么意思&#xff1f; 这是最终的客户体验词汇表&#xff0c;可帮助指导您。 客户体验&#xff0c;也称为 CX&#xff0c;会影响从客户参与度、保留率、忠诚度、终生价值到最终盈利的方方面面。 难怪获得正确的客户体验是…

免费的chaGPT安利给大家 ,体验了一下还是不错的!!!分享下感受

第一点&#xff1a; 确实很智能、聪明 &#xff0c;知道你想问的问题&#xff0c;即使问题不清楚&#xff0c;比传统的单一搜索具有连贯性&#xff0c;能根据上几次问题进行连贯回答 。第二点&#xff1a; 用来搜索代码确实真的方便&#xff0c;代码注释都写的清清楚楚、详细 &…

ChatGPT这么火,你会被取代吗?

前言 ChatGPT爆火后&#xff0c;“程序员要失业了”、“程序员要下岗了”之声不绝于耳&#xff0c;引得程序员们不由得一阵惊慌。 ChatGPT这么火&#xff0c;以后是不是不需要那么多程序员了。 这个话题太过于火热&#xff0c;我也不由的试用了下&#xff0c;但是经过使用、和…

炸裂了!3分钟用GPT4做一个PPT!

GPT4有多强了&#xff0c;相信体验过的同学都知道&#xff0c;一个字爽&#xff01;无论是速度&#xff0c;还是数据集还是功能都比3.5要强大很多。现在越来越多的人开始用GPT4了&#xff0c;可以大幅的提高我们的工作和学习的效率&#xff0c;今天小编就用GPT4快速做一个PPT&a…

CPU、GPU与算存互连的复杂比较与重要性分析

LLM | AMD | Intel | NVIDIA GLM | ARM | AIGC | Chiplet 随着深度学习、高性能计算、NLP、AIGC、GLM、AGI的快速发展&#xff0c;大模型得到快速发展。2023年科创圈的顶尖技术无疑是大模型&#xff0c;据科技部新一代人工智能发展研究中心发布的《中国人工智能大模型地图研究…

[YOLO] yolov3 博客学习笔记汇总

pip下载速度太慢&#xff0c;国内镜像&#xff1a; 国内镜像解决pip下载太慢https://blog.csdn.net/weixin_51995286/article/details/113972534 在线卷积计算器&#xff1a; 在线卷积计算器http://www.sqflash.com/cal.html 网络学习 IOU: 机器学习知识总结 —— 11. 关…

多种UI和界面设计汇总(一)

下面汇总了一些不错的UI设计的效果图&#xff0c;让我们看看多种UI布局和界面设计。它们风格迥异&#xff0c;也基本上都是Web页面上的。下面请看&#xff1a; Old Paper Layout/旧纸张布局 Professional Modern Web Layout/专业现代网页布局 Photography portfolio Design/影集…

从交互设计师的角度,聊聊设计工具的那些事

工欲善其事&#xff0c;必先利其器&#xff0c;这句话是出自论语&#xff0c;讲的是要做好一件事&#xff0c;工具是非常重要的&#xff0c;作为一个设计师&#xff0c;设计工具对于我们的重要性毋庸置疑&#xff0c;每天都在接触&#xff0c;也有很多感悟和心得。 我从事设计…

移动开发实验一:微信ui设计

一、设计目标 1.1 设计要求 完成类微信的门户页面框架设计&#xff0c;APP最少必须包含4个tab页面。框架设计需要使用 fragment&#xff0c;activity&#xff0c;不得使用UNIAPP技术进行开发&#xff08;H5或者小程序&#xff09;&#xff1b; 1.2 设计功能介绍 &#xff08;1&…

UI设计,仅是画张图吗?

UI设计&#xff0c;仅是画张图吗&#xff1f; 很多时候&#xff0c;当别人问及你是做UI设计&#xff0c;会随口说&#xff1a;“哦&#xff0c;美工&#xff01;“。象这样的称呼&#xff0c;很多有UI比较早的公司&#xff08;比如金山&#xff0c;讯腾等&#xff09;&#x…

后台ui大全(有这些你就够了)

做过后台开发的都知道&#xff0c;我们后台ui基本上都是去拖一个现成的ui框架&#xff0c;然后我们在此基础上改改就差不多了&#xff0c;那该如何选择合适的后台ui呢&#xff0c;哥们那你走运了&#xff0c;我最近整理了最近用的比较多的后台ui,希望有你喜欢的一款。(后面有下…

GUI绘图界面设计

本文介绍matlab中简单的gui绘图界面设计 设计内容&#xff1a; 1、设计GUI界面&#xff1a; 2、通过下拉菜单选择绘制正弦、正切函数&#xff1b; 3、通过编辑框输入命令&#xff0c;根据命令绘制图形&#xff1b; 4、通过按钮在图形中输出标注&#xff08;标题、各轴名称&…

前端ui设计稿

每个设计师都有「像素级还原」的设计追求&#xff0c;我总结了工作几年还原设计稿的几点经验。全文10059字&#xff0c;阅读时长约21分钟。 前言 UI设计师作为展示产品形态的执行层。产品上线前走查视觉与交互还原是必经环节&#xff0c;设计师可能都遇到过一个问题&#xff0…

【UI】关于如何画设计稿(基础篇)

文章目录 前言精炼对齐重复 详尽设计的四个基础原则简介亲密性原则对齐原则重复原则对比原则 前言 设计是自己的一个爱好&#xff0c;平时看了许多相关的内容&#xff0c;做了许多功课&#xff0c;到现在也有了一些成果。介于自己的并非专业人员&#xff0c;我没有将自己这些年…

chatgpt赋能python:Python字幕滚动:如何让你的视频内容更吸引人

Python字幕滚动&#xff1a;如何让你的视频内容更吸引人 如果你是一位视频创作者&#xff0c;你可能知道如何通过字幕来增加你的视频的吸引力。Python提供了一种简单且高效的方法来制作字幕滚动。字幕滚动是指将文字逐个显示在视频下方&#xff0c;以帮助观众跟上视频的进展。…

修复网站从万年PHP7.2更新到PHP8.0后的出现的bug

写在前面 2021年5月20日23:30左右&#xff0c;因为看到了WordPress仪表盘疯狂提示“为了网站的安全和效能&#xff0c;推荐使用PHP版本7.4以上”&#xff0c;然后我终于做出了一个令我后悔至今的决定——把万年没更新的PHP7.2直接更新到PHP8.0。在更新完成的那一刻&#xff0c…