thymeleaf动态选中select_一些LowPoly动态渐变效果实现

c6a244e931326314baf2d28ea32dc3d0.png

这篇文章根大家分享一些LowPoly动态效果的制作方法,由于使用的是uv采样方式效率很高,手机也可以随意使用,我们先来看一些效果的参考

本文将在Unity3D中还原这些效果,如果你学会后当然可以在你喜欢的引擎中实现~如果一篇太长有可能会分多篇,感兴趣的可以关注我~

参考图

72fac65ce6d341a7ba77760c86bc5852.png

完成效果

07b1481edbc1a40eefc744e95f72ad8e.gif

d4c8d1b3a665d593ea59e32fc7b7e0f1.gif

8076522992b52edc0efc0c20ad378463.gif

以往我们在实现多边形渐变是多是遍历定顶点修改vertexColor去实现,本效果将重UV下手

首先需要一个做一个特殊的uv,我将用maya举例(当然也可以请美术的小伙伴帮助制作Mesh)

我们首先需要这样的一个面片

599c6e88b8cdbca8c271003b01b192c8.png

我们先以这个基础的网格举例,Windows -> UV Texture Editor 打开uv 编辑器

这时uv是个样子,我们需要将uv打断,并将每个方格的uv 缩放为一个点(这就是本篇的重点了)也就是说每个网格mesh上的面uv只有一个点大小,有很多方法可以实现,我讲的方法不一定是最好的,大家可以大开脑洞~

f188119ddbd2aa3b2554ada9535909c5.png

1.选中模型按鼠标右键切换为点显示

c82f861852e8a70e417286d99f433a51.png

2.框选所有的点,然后EditMesh->DetachComponent (分离组件)

3.我们再次切换为物体模式

4.我们再次点击菜单 Mesh-> Separate (分离Mesh)

其实我们上面的主要操作就是为了以线分割mesh将一个大面片分割成小面片

478ab2a2ecd3935f2165871fc77d4ddf.png

5.这时所有的小mesh 的中心点都在一起(也就是原来大mesh的中心点)我们全选所有被缩小的mesh 进行中心点恢复 Modify-> CenterPivot

这时所有的小mesh的中心点都在自己的位置了,下面我们对他进行缩放

808b97e1296587df98252679d0947e8e.gif

6.在右边通道栏我们将其缩放到 0.001后,点击菜单 CreateUVs -> PlanarMapping,我们点击后面的小方块打开选项设置,选中y 轴投射UV

这时uv 就变成点状了 ,全选所有小mesh在右边通道栏我们将mesh缩放恢复回来

7.现在点击菜单栏 Mesh->Combine 将所有小mesh 组合到一起 ,这时点还没有合并

8.切换为点模式 全选所有点,点击菜单 EditMesh-> Merge ,这时mesh就恢复为一个整体了

UV 也已经被我们处理为点状 ,当然我们可以使用脚本处理这个过程,下面是批处理脚本,选中模型后点击 CreateUV 将会创建二套uv 并命名为lowPoly(需要注意一点,maya 中map1 对应shader中 uv0,lowPoly对应 uv1,依次类推)

15e5e688deaee652ef04f1408c85a765.png
import sys
import maya.cmds as cmd
def detachPoly(firstObject,faces):#分离选中Mesh(kft) cmd.polyChipOff (firstObject +'.f[0:%d]'%faces,kft=False,dup=False) cmd.polySeparate (firstObject,rs=True)def centerPivot(allSelected,scaleValue):#恢复中心点/缩放for i in allSelected:cmd.xform(i, centerPivots=True) cmds.setAttr(i + "." + "scale", scaleValue, scaleValue,scaleValue, type="double3")
def CreateUV(*args):selected = cmd.ls( selection=True )firstObject = selected[0]faces = cmd.polyEvaluate(firstObject,f=True)#获取面数detachPoly(firstObject,faces)selected = cmd.ls(selection =True)centerPivot(selected,0.001)cmd.selectMode( component=True )for i in selected:cmds.select(i+'.f[0]', add=True ) #选中所有Meshcmd.polyProjection(type='Planar' ,md ='y',uvs ='lowPoly',ibd = True,cm =True) #投影uvcenterPivot(selected,1)cmd.polyUnite(selected,n = firstObject) #合并Meshcmd.polyMergeVertex(d = 0.1) #合并点cmd.DeleteAllHistory()def stripsCreate(*args):windowID = 'PointProcessing'if cmds.window(windowID, exists=1):cmds.deleteUI(windowID)cmds.window(windowID, title='UV PointProcessing', menuBar=1, h=100, w=200)cmds.columnLayout(adjustableColumn=1)cmds.button(label='Create UV',  command=partial(CreateUV), h=50,w=100)cmds.columnLayout(adjustableColumn=1)cmds.showWindow(windowID)stripsCreate()

导出之前记得删除所有的构造历史 Edit-> DeleteAllbyType->History

顺便说下maya的默认单位是厘米,Unity是米,如果你想1:1 导出

记得在设置将maya 单位设置为米

617d494b63f66b6e42ad0b32e95ff423.png

这时就可以导入到Unity中,shader部分比较简单直接上代码,需要注意的一点就是 由于我们uv是近似的一个点,如果想有平滑的过度效果 Mask图不能压缩 需要设置为RBG 24 ,因为图片分辨率不需要很大所以实际也占不了多少内存

9a6870a2fb2ac10ebb32060ec3583cd2.png
Shader "lowPolygon" {Properties {_Color ("Color", Color) = (0,0.1721497,3301887,1)_Color2("Color2", Color) = (0.2783019,0.6024179,1,1)_texture ("texture", 2D) = "white" {}_speed ("speed", Float ) = 5_tiling("tiling", Float) = 0.01}SubShader {Tags {"RenderType"="Opaque"}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"uniform float4 _TimeEditor;uniform float4 _Color, _Color2;uniform sampler2D _texture; uniform float4 _texture_ST;uniform float _speed, _tiling;struct VertexInput {float4 vertex : POSITION;float2 texcoord0 : TEXCOORD0;};struct VertexOutput {float4 pos : SV_POSITION;float2 uv0 : TEXCOORD0;};VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.uv0 = v.texcoord0;o.pos = UnityObjectToClipPos(v.vertex );return o;}float4 frag(VertexOutput i) : COLOR {float4 materialTime = _Time + _TimeEditor;float2 texUv = i.uv0+(materialTime.g *_speed)* _tiling;//mask需要四方连续float4 texture_var = tex2D(_texture,TRANSFORM_TEX(texUv, _texture));float3 emissive = lerp(_Color.rgb, _Color2.rgb,texture_var.r);return fixed4(emissive,1);}ENDCG}}
}

将材质赋予刚才导入的面片就是下面的效果

知乎视频​www.zhihu.com

我们先来实现参考图1 的效果 ,实际上我们只需要将上面的视频中的效果增加一些渐变色就可以达到了,新增两个Mask G通道 控制左右分色 B通道控制重中间向两边的压暗区域

4b42379ad369dd214d00771123a6162d.png
 struct VertexInput {float4 vertex : POSITION;float2 texcoord0 : TEXCOORD0;float2 texcoord1 : TEXCOORD1;};struct VertexOutput {float4 pos : SV_POSITION;float2 uv0 : TEXCOORD0;float2 uv1 : TEXCOORD1;};VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos(v.vertex );o.uv0 = v.texcoord0;o.uv1 = v.texcoord1;return o;}float4 frag(VertexOutput i) : COLOR {float4 materialTime = _Time + _TimeEditor;float2 texUv = i.uv0+(materialTime.g *_speed)* _tiling;float texture_R = tex2D(_texture,TRANSFORM_TEX(texUv, _texture)).r;float texture_G = tex2D(_texture, TRANSFORM_TEX(i.uv1, _texture)).g; //Mask要用正常的uv,mesh里要展uv2float texture_B = tex2D(_texture, TRANSFORM_TEX(i.uv1, _texture)).b; //Mask要用正常的uv,mesh里要展uv2float3 color_L = lerp(_ColorL_1.rgb, _ColorL_2.rgb, texture_R);float3 color_R = lerp(_ColorR_1.rgb, _ColorR_2.rgb, texture_R );float3 colorlerp = lerp(color_L, color_R, texture_G) * (texture_B + _Dark);return fixed4(colorlerp,1);}
知乎视频​www.zhihu.com

第二个效果只需要改变下B通道 Mask 和颜色就可以了 ~

6411014bcb0d14cff7f223cc1dfa4c88.png
知乎视频​www.zhihu.com

我们如果把模型做成立体的 ,配合雾效就可以做出 3 号图的效果

d72732c639acb8b392c9efa29cf98f5d.png

我们增加一些颜色控制可以增强颜色的表现力,也可以增加一些顶点的抖动,我这里还使用原来那张贴图,你可以算一个随机值

Shader "lowPolygon_2" {Properties {_ColorL_1("ColorL_1", Color) = (0,0.1721497,3301887,1)_ColorL_2("ColorL_2", Color) = (0.2783019,0.6024179,1,1)_ColorL_3("ColorL_3", Color) = (0.2783019,0.6024179,1,1)_ColorL_Offset_1("ColorL_Offset_1", Float) = 1_ColorL_Offset_2("ColorL_Offset_2", Float) = 1_ColorR_1("ColorR_1", Color) = (0,0.1721497,3301887,1)_ColorR_2("ColorR_2", Color) = (0.2783019,0.6024179,1,1)_ColorR_3("ColorR_3", Color) = (0.2783019,0.6024179,1,1)_ColorR_Offset_1("ColorR_Offset_1", Float) = 1_ColorR_Offset_2("ColorR_Offset_2", Float) = 1_Dark("Dark", Float) = 1_texture ("texture", 2D) = "white" {}_speed ("speed", Float ) = 5_tiling("tiling", Float) = 0.01_vertexHeight("vertexHeight",Float) = 1}SubShader {Tags {"RenderType"="Opaque"}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_foguniform float4 _TimeEditor;uniform float4 _ColorL_1, _ColorL_2, _ColorL_3, _ColorR_1, _ColorR_2, _ColorR_3;uniform sampler2D _texture; uniform float4 _texture_ST;uniform float _speed, _tiling, _Dark , _vertexHeight, _ColorL_Offset_1, _ColorL_Offset_2, _ColorR_Offset_1, _ColorR_Offset_2;struct VertexInput {float4 vertex : POSITION;float2 texcoord0 : TEXCOORD0;float2 texcoord1 : TEXCOORD1;};struct VertexOutput {float4 pos : SV_POSITION;//float2 uv0 : TEXCOORD0;float2 uv1 : TEXCOORD1;float2 timeUv : TEXCOORD2;UNITY_FOG_COORDS(4)};VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;float4 materialTime = _Time + _TimeEditor;float2 texUv0 = v.texcoord0 + (materialTime.g * _speed) * _tiling;float2 texUv1 = v.texcoord1 + (materialTime.g * _speed) * _tiling;o.timeUv = texUv0; //注意下哦 我这里uv0 才是点状uv,如果你用脚本创建的uv这个要修改下float4 offset_var = tex2Dlod(_texture, float4(TRANSFORM_TEX(texUv1, _texture), 0.0, 0));v.vertex.xyz += offset_var.r * _vertexHeight;o.pos = UnityObjectToClipPos(v.vertex );UNITY_TRANSFER_FOG(o, o.pos);//o.uv0 = v.texcoord0;o.uv1 = v.texcoord1;return o;}float4 frag(VertexOutput i) : COLOR {float texture_R = tex2D(_texture,TRANSFORM_TEX(i.timeUv, _texture)).r;float texture_G = tex2D(_texture, TRANSFORM_TEX(i.uv1, _texture)).g; //Mask要用正常的uv,mesh里要展uv2float texture_B = tex2D(_texture, TRANSFORM_TEX(i.uv1, _texture)).b; //Mask要用正常的uv,mesh里要展uv2float3 color_L = lerp(_ColorL_1.rgb, _ColorL_2.rgb, texture_R * _ColorL_Offset_1);float3 color_L2 = lerp(color_L, _ColorL_3, saturate(pow(texture_R * _ColorL_Offset_2, 3)));float3 color_R = lerp(_ColorR_1.rgb, _ColorR_2.rgb, texture_R * _ColorR_Offset_1);float3 color_R2 = lerp(color_R, _ColorR_3, saturate(pow(texture_R * _ColorR_Offset_2, 3)));float3 colorlerp = lerp(color_L2, color_R2, texture_G) * (texture_B + _Dark);float4 finalColor = float4(colorlerp, 1);UNITY_APPLY_FOG(i.fogCoord, finalColor);return finalColor;}ENDCG}}FallBack "Diffuse"
}
知乎视频​www.zhihu.com

也可以增加线框渲染再 配合不同mesh 和 mask ,Color 就可组合其他的效果出来~

参考图来自

Download Abstract Blue Triangle Geometric Pattern Banner Design for free​www.freepik.com
2fcbbfad2e770d77e9e850f61ad046ed.png

字体来自

创意字体--商用字体_免费字体_字体下载_三极字库官网​sjtype.com
4c83212f8fc9e2d1c6ce7be7ce86baa7.png

工程下载

ShaderFallback/LowPolyShader​github.com
b67ccf4a825dc3726df392fc60578dd6.png

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

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

相关文章

使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信

参考链接 Ubuntu配置gmssl和openssl,且均使用动态库,使用时根据需要进行动态切换_MY CUP OF TEA的博客-CSDN博客 编译gmssl动态库并关闭openssl配置,开启gmssl配置基于GmSSL实现server服务端和client客户端之间SSL通信代码(升级…

使用Clion和openssl动态库实现服务器server和客户端client之间的SSL通信

参考链接 使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信_MY CUP OF TEA的博客-CSDN博客 服务端server CMakeLists.txt文件 cmake_minimum_required(VERSION 3.22)project(ssl_server) set(CMAKE_CXX_STANDARD 11)# 忽略警告 set(CMAKE_CXX_FLAGS &quo…

使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信,测试指定密码套件

参考链接 列出gmssl支持的国密算法TLS1.x密码套件_liuqun69的博客-CSDN博客使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信_MY CUP OF TEA的博客-CSDN博客 注意事项 GM/T 标准涵盖 2 个协议:- SSL VPN 协议 (GM/T 0024-2014)- IPSec VPN 协议…

样式缓存没更新_差点没认出来:Office 2019/365桌面新图标来啦

微软应该是从昨天晚上开始就向Microsoft Office 正式版通道推送新图标(测试版早就推送了),主要包括的是桌面文档显示图标。目前微软更新图标的速度有些慢并且还有些混乱,因为这些图标并不是同时更新的而存在分批分次推送情况。如下图多数组件已经可以看到…

10kv线路负载率计算_电工必懂计算公式,你若不会,如何立足于电力行业?

一电力变压器额定视在功率Sn200KVA,空载损耗Po0.4KW,额定电流时的短路损耗PK2.2KW,测得该变压器输出有功功率P2=140KW时,二次则功率因数20.8。求变压器此时的负载率b 和工作效率。解:因P2bSn2100%bP2(Sn2)100%140(2000…

在基于 Ubuntu 的 Linux 发行版上安装 Wireshark

参考链接 Ubuntu 上 Wireshark 的安装与使用 - 知乎https://www.myfreax.com/how-to-add-apt-repository-in-ubuntu/ 前情提要 使用Ubuntu软件中心或命令行apt或apt-get安装软件包时,这些软件包是从一个或多个apt软件存储库中下载的。 APT存储库是一个网络服务器或…

使用wireshark抓包,验证客户端和服务端SSL通信时指定的算法套件

前情提要 使用Clion和gmssl动态库实现服务器server和客户端client之间的SSL通信,测试指定密码套件_MY CUP OF TEA的博客-CSDN博客在基于 Ubuntu 的 Linux 发行版上安装 Wireshark_MY CUP OF TEA的博客-CSDN博客本地搭建server和客户端使用端口进行数据通信&#xf…

r语言随机森林回归预测_从零实现回归随机森林

一、前言回归随机森林作为一种机器学习和数据分析领域常用且有效的算法,对其原理和代码实现过程的掌握是非常有必要的。为此,本文将着重介绍从零开始实现回归随机森林的过程,对于随机森林和决策树的相关理论原理将不做太深入的描述。本文的目…

openssl编程-基础知识-回调函数

参考内容 OpenSSL编程 赵春平 回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数把一段可执行的代码像参数传递…

openssl编程-基础知识-OpenSSL简介

参考链接 在ubuntu环境下执行openssl编译和安装_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL编程 赵春平 OpenSSL 简介 它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编…

linux修改文件句柄数生效_linux系统层面调优和常见的面试题

linux系统层面调优和常见的面试题​mp.weixin.qq.com无论对Spark集群,还是Hadoop集群等大数据相关的集群进行调优,对linux系统层面的调优都是必不可少的,这里主要介绍3种常用的调优:1.linux文件句柄linux在整个系统层面和单个进程…

openssl编程-基础知识-OpenSSL堆栈

堆栈介绍 堆栈是一种先进后出的数据结构openssl 大量采用堆栈来存放数据。它实现了一 个通用的堆栈,可以方便的存储任意数据它实现了许多基本的堆栈操作,主要有:堆栈拷贝(sk_dup)、构建新堆栈(sk_new_null,sk_new&…

小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV

不同手机品牌都有着自己不同的定位人群,在国内市场目前几大非常有名的手机品牌分别被三星、苹果、华为、小米、OV占据,而这些手机品牌的主要购买人群到底是什么样的呢?企鹅智库近日发布了一份手机消费者的调研报告,并且根据消费者…

国密gmtls协议-双证书体系的服务端和客户端通信代码

内容介绍 国密的双证书体系,将证书按照使用目的的不同划分为加密证书和签名证书两种,也就是两对公私钥,二者本质一致,均为SM2密钥对,区别仅体现在用法国密CA体系中,加密密钥对由CA产生,签名密钥…

jwt 私钥_什么是 JSON Web Token(JWT)

有关本文档的快速链接,请参考页面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作为一个开放的标准 (RFC 7519) 定义了一种简洁自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为有数字签名,所以这些通信的信息能够被校验…

天线下倾角示意图_常用天线和无源器件技术参数汇总

原标题:常用天线和无源器件技术参数汇总一、天线原理天线的定义: 能够有效地向空间某特定方向辐射电磁波或能够有效的接收空间某特定方向来的电磁波的装置。天线的功能: 能量转换-导行波和自由空间波的转换; 定向辐射(接收)-具有一定的方向性…

制作作品图片_不懂人文后期制作流程?来,大师手把手教你

制作前1、处理一张照片思路决定步骤 想要了解学习的老师可以私聊小编fzhdyx222制作后2、2020年最新Camera Raw局部影调和色调的控制想要了解学习的老师可以私聊小编fzhdyx222制作前3、2020年最新Camera Raw基础工具细节性运用想要了解学习的老师可以私聊小编fzhdyx222制作后4、…

xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?

最近我重装了系统(Win10Office2016),然后发现了一个奇怪的bug:双击xlsx文件,只能打开Excel窗口,但是打不开这个文件,有时候再次双击就能打开了,但有时再次双击也不管用,需要在Excel的菜单中点“…

gmssl使用双证书双向认证的gmtl协议报错crypto/sm2/sm2_sign.c 510: sm2_do_verifySSL3 alert write:fatal:decrypt error

报错内容 crypto/sm2/sm2_sign.c 510: sm2_do_verify SSL3 alert write:fatal:decrypt error SSL_accept:error in error ERROR 140655864152064:error:1417B07B:SSL routines:tls_process_cert_verify:bad signature:ssl/statem/statem_srvr.c:2941: 相关内容 版本&#xf…

纠偏的意思_承压能力和纠偏能力,决定成长的高度

承压能力,包含抗压能力、抵御能力,担当能力,分解能力,消化能力,释放能力,等一系列的精神要素,是一个人生存生活工作中一项重要的素质。有的人,承压能力很强,无论经受什么…