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.pswp.cn/news/445894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445894.shtml
英文地址,請注明出處:http://en.pswp.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通信代碼(升級…

shiro 攔截未登錄的ajax_Shiro是如何攔截未登錄請求的(二)

/*** 重寫父類獲取sessionID的方法,若請求為APP或者H5則從請求頭中取出token,若為PC端后臺則從cookie中獲取** param request* param response* return*/Overrideprotected Serializable getSessionId(ServletRequest request, ServletResponse response){if (!(request instan…

使用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 正式版通道推送新圖標(測試版早就推送了),主要包括的是桌面文檔顯示圖標。目前微軟更新圖標的速度有些慢并且還有些混亂,因為這些圖標并不是同時更新的而存在分批分次推送情況。如下圖多數組件已經可以看到…

在Ubuntu上安裝Git

安裝步驟 首先,確認系統是否已安裝git,可以通過git指令進行查看,如果沒有,則輸入sudo apt-get install git命令進行安裝。 安全配置 安裝完成后進行git配置,輸入指令git config --global user.name "xxx"…

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編程 趙春平 回調函數 回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數把一段可執行的代碼像參數傳遞…

hive插件 ranger_Apache Ranger及Hive權限控制

一、Ranger概述1.Ranger簡介Apache Ranger提供一個集中式安全管理框架, 并解決授權和審計。它可以對Hadoop生態的組件如HDFS、Yarn、Hive、Hbase等進行細粒度的數據訪問控制。通過操作Ranger控制臺,管理員可以輕松的通過配置策略來控制用戶訪問權限。本文章介紹Ranger與Hive集成…

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 對象的形式安全的傳遞信息。因為有數字簽名,所以這些通信的信息能夠被校驗…

server和client之間進行Socket通信,進行數據切片

參考鏈接 send函數和recv函數 – gudakos memo 注意事項 代碼很low&#xff0c;主要看封裝的Send函數所體現的切片思想即可 server代碼 //udp服務端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天線下傾角示意圖_常用天線和無源器件技術參數匯總

原標題&#xff1a;常用天線和無源器件技術參數匯總一、天線原理天線的定義&#xff1a; 能夠有效地向空間某特定方向輻射電磁波或能夠有效的接收空間某特定方向來的電磁波的裝置。天線的功能&#xff1a; 能量轉換-導行波和自由空間波的轉換; 定向輻射(接收)-具有一定的方向性…