国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

這篇具有很好參考價值的文章主要介紹了Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity制作二次元材質(zhì)角色


回到目錄

大家好,我是阿趙。
這里繼續(xù)講二次元角色材質(zhì)。這次打算講一下描邊和細節(jié)的添加。

一、外描邊

外描邊的做法也不止一種,比如后處理方法的偏導(dǎo)數(shù)ddx/ddy之類的,也能整個屏幕的求出邊緣。但一般來說單模型渲染常用的描邊方式,是寫多一個Pass,這個Pass是Cull Front的,也就是說是剔除了正面的,然后給模型的頂點沿著法線方向稍微擴大一點,填充成黑色,最后把正常顏色的模型放在黑色模型的重疊位置,那么黑色模型就變成了描邊了效果了。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

這個就是Cull Front的Pass的效果。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

把2個pass一起渲染,就能得到描邊的效果。
值得注意的是,沿著法線放大模型這一步,頂點坐標(biāo)應(yīng)該在哪個空間里面來做放大呢?
一般來說,使用世界空間肯定是可以的,就是先求出頂點的世界坐標(biāo)和世界法線方向,然后世界坐標(biāo)加上世界法線乘以一個控制大小的值。
但更好的做法,是在觀察空間里面做這個擴展。這是因為,有時候我們想讓這個Cull Front的Pass渲染的黑色模型,可以沿著我們觀察的方向的Z軸做偏移,如果在世界空間坐標(biāo)里面做法線擴展,明顯是很難找到一個軸是可以沿著攝像機方向的。如果我們先把頂點坐標(biāo)和法線都轉(zhuǎn)換到觀察空間,那么在觀察空間里面的Z坐標(biāo),其實就是離我們觀察點的遠近了。
這里有2個做法:
1、在法線轉(zhuǎn)換成觀察空間之后,把法線的z軸直接固定到一個值,這樣模型沿著法線方向擴展時,在z軸會沿著我們想要的方向去放大,比如:

v2f vert(appdata v)
{
	v2f o;
	float4 pos = mul(UNITY_MATRIX_MV, v.vertex);
	float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
	normal.z = -0.5;
	pos = pos + float4(normalize(normal), 0) * _OutlineLen*0.001;
	o.pos = mul(UNITY_MATRIX_P, pos);
	return o;
}

2、在觀察空間擴展完法線之后,用一個值來控制偏移后頂點的z軸偏移,比如:

v2f vert(appdata v)
{
	v2f o;
	float4 pos = mul(UNITY_MATRIX_MV, v.vertex);
	float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
	pos = pos + float4(normalize(normal), 0) * _OutlineLen*0.001;
	pos.z -= v.vertexColor.b;
	o.pos = mul(UNITY_MATRIX_P, pos);
	return o;
}

我這里用了一個頂點顏色的B通道去偏移Z軸,是因為這是一般的習(xí)慣做法,通過給頂點顏色指定一個通道,作為描邊Z軸偏移的量,這樣的做法,可以實現(xiàn)整個模型不同部位的描邊顯示不一樣。
由于我手上的這個模型并沒有烘焙頂點色,所以沒有頂點通道可以控制,所以我就使用第一種方式來處理。

二、內(nèi)描邊

剛才得到的是外描邊。正常來說,如果項目要求不高,也勉強夠用了。但如果我們想把效果做得更貼近卡通,那么按道理來說,模型除了外部有描邊,模型內(nèi)部應(yīng)該也會有一些描邊的細節(jié)。
回頭看看之前說的ILM貼圖的A通道:
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

可以發(fā)現(xiàn),這張貼圖提供了模型里面的描邊效果。一般來說,在貼圖上面畫內(nèi)描線,會遇到一個問題:
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

同樣一張貼圖上,水平或者垂直的線條,會很清晰,但斜線,會起馬賽克,會模糊。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

放大我們的這個角色模型,看一下內(nèi)描線的效果,發(fā)現(xiàn)每一內(nèi)描線,基本都很清晰,沒有出現(xiàn)斜線模糊的情況。這是為什么呢?
接下來看一下這張ILM貼圖的A通道,可以發(fā)現(xiàn)一些東西:
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

會發(fā)現(xiàn),這個內(nèi)描線,基本上都是水平和垂直的線,并沒有出現(xiàn)任何斜線。其實這是一種經(jīng)驗和技巧。在展UV的時候,我們盡量把模型的UV展成這張水平和垂直的方向,這樣在畫這張線條形的貼圖時,線條就能非常的清晰。
這種事情最好是在一開始的時候就規(guī)劃好。如果說實在做不到,因為漫反射貼圖已經(jīng)畫好了,沒法改,那么,我們也可以通過展UV2,特別為這個內(nèi)描線展一張水平垂直的UV。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

加上了內(nèi)描邊之后,整體的感覺就豐富了很多了。

三、細節(jié)線條

如果想再進一步添加一些小劃痕或者痕跡,這里還可以添加一張細節(jié)圖:
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

看得出來,這張圖片并沒有像內(nèi)描邊一樣,講究水平垂直的畫線,整體比較隨意。因為這張貼圖添加的是一些像手繪的筆觸一樣的線條,并不需要非常的整齊和明顯。
把這張圖也加上,那么線條方面的工作就基本完成了:
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

四、貼花

最后才說貼花,是因為這個貼花是獨立于之前的角色模型貼圖以外的。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

本來這個模型是分為了身體和武器(吉他)2個部分的,所以剛才說到的所有圖,包括BaseMap、SSSMap、ILMMap,都是身體一套,武器一套的。但這一張貼花的圖片,卻是身體和武器共用的。
為什么不同的模型可以共用一張貼圖呢?這是因為,這張貼花貼圖,是使用了UV2的,也就是說,把身體和武器需要貼花的部分展成UV2然后合并在一起。至于不需要貼花的部分,UV基本上是縮小到看不見的。
所以這個部分其實也沒什么好說的,直接讀取模型的UV2,然后賦予貼圖就行了。我自己做了一點小改動,因為吉他弦的部分沒有地方控制透明通道,所以我給這張貼花圖片做了個透明通道,讓吉他弦能正常的顯示出來。
Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加

加上了貼花之后,整個模型的顯示基本上就完成了。文章來源地址http://www.zghlxwxcb.cn/news/detail-479977.html

五、完整Shader

Shader "azhao/ToonBodyOutline"
{
    Properties
    {
        _BaseMap ("BaseMap", 2D) = "white" {}
		_SSSMap("SSSMap", 2D) = "white" {}
		_ILMMap("ILMMap", 2D) = "white" {}
		_DetailMap("DetailMap",2D) = "white"{}
		_specColor("specColor",Color) = (1,1,1,1)
		_shininess("shininess", Range(1 , 100)) = 1
		_SpecAdd("SpecAdd",float) = 1.0


		_GradationMin("GradationMin",Range(0.0,1.0)) = 0.0
		_GradationMax("GradationMax",Range(0.0,1.0)) = 1.0

		_OutlineColor("OutlineColor",Color) = (0,0,0,1)
		_OutlineLen("_OutlineLen",float) = 2

		_MatCapTex("MatCapTex", 2D) = "white" {}
		_MatCapIntensity("MatCapIntensity",Range(0,2)) = 1
		_MatCapPow("MatCapPow",Range(0,5)) = 1
		_MatCapUVScale("MatCapUVScale",Range(0,1)) = 1

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
			#pragma multi_compile_fwdbase
			#include "AutoLight.cginc"

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

            struct v2f
            {                
                float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
				float3 worldPos :TEXCOORD2;
				float3 worldNormal :TEXCOORD3;
            };

            sampler2D _BaseMap;
            float4 _BaseMap_ST;
			sampler2D _SSSMap;
			sampler2D _ILMMap;
			sampler2D _DetailMap;
			float4 _specColor;
			float _shininess;

			float _SpecAdd;
			float _GradationMin;
			float _GradationMax;
			sampler2D _MatCapTex;
			float _MatCapIntensity;
			float _MatCapPow;
			float _MatCapUVScale;

			//獲取HalfLambert漫反射值
			float GetHalfLambertDiffuse(float3 worldPos, float3 worldNormal)
			{
				float3 lightDir = UnityWorldSpaceLightDir(worldPos);
				float NDotL = dot(worldNormal, lightDir);
				float halfVal = NDotL * 0.5 + 0.5;
				return halfVal;
			}

			//獲取BlinnPhong高光
			float GetBlinnPhongSpec(float3 worldPos, float3 worldNormal)
			{
				float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
				float3 halfDir = normalize((viewDir + _WorldSpaceLightPos0.xyz));
				float specDir = max(dot(normalize(worldNormal), halfDir), 0);
				float specVal = pow(specDir, _shininess);
				return specVal;
			}


			float2 GetMatCapUV(float3 normalWorld)
			{
				float3 normalView = mul(UNITY_MATRIX_IT_MV, normalWorld);
				return normalView.xy*0.5 + 0.5;
			}

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _BaseMap);
				o.uv2 = TRANSFORM_TEX(v.uv2, _BaseMap);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                // sample the texture
                half4 col = tex2D(_BaseMap, i.uv);
				half4 sssCol = tex2D(_SSSMap, i.uv);
				half4 ilmCol = tex2D(_ILMMap, i.uv);
				half4 detailCol = tex2D(_DetailMap, i.uv2);
				//色階化
				half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
				half toonVal = smoothstep(_GradationMin, _GradationMax, halfLambert);


				half specVal = GetBlinnPhongSpec(i.worldPos, i.worldNormal);
				float2 MatCapUV = GetMatCapUV(i.worldNormal)*_MatCapUVScale;
				float4 MatCapCol = tex2D(_MatCapTex, MatCapUV)*_MatCapIntensity;
				MatCapCol = pow(MatCapCol, _MatCapPow);



				half3 finalRGB = col.rgb*toonVal + sssCol  * (1 - toonVal)+_specColor* specVal*ilmCol.r+ _specColor * specVal*ilmCol.b*_SpecAdd;
				finalRGB = finalRGB * (1-ilmCol.b) +MatCapCol.rgb*ilmCol.b;
				finalRGB = finalRGB * ilmCol.a*detailCol.r;
				half alpha = col.a;
                return half4(finalRGB,alpha);
            }
            ENDCG
        }
		
		Pass
		{
			Cull Front
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"
			#pragma multi_compile_fwdbase
			#include "AutoLight.cginc"

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

			struct v2f
			{
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float3 worldPos :TEXCOORD1;
				float3 worldNormal :TEXCOORD2;
			};


			float4 _OutlineColor;
			float _OutlineLen;

			v2f vert(appdata v)
			{
				v2f o;
				float4 pos = mul(UNITY_MATRIX_MV, v.vertex);
				float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
				normal.z = -0.5;
				pos = pos + float4(normalize(normal), 0) * _OutlineLen*0.001;
				o.pos = mul(UNITY_MATRIX_P, pos);
				return o;
			}

			half4 frag(v2f i) : SV_Target
			{
				return _OutlineColor;
			}
			ENDCG
		}
    }
}

到了這里,關(guān)于Unity制作二次元卡通渲染角色材質(zhì)——4 、內(nèi)外描邊和細節(jié)添加的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 原神3D卡通動漫二次元角色模型Blender已綁骨骼

    原神3D卡通動漫二次元角色模型Blender已綁骨骼

    3Dmax/C4D這類軟件應(yīng)該做三維的都知道。Blender知道的應(yīng)該不多。一款跨平臺開源的 3D 創(chuàng)作軟件,可以在 Linux、macOS 以及 Windows 系統(tǒng)下運行。與其他 3D 建模工具相比,Blender 對內(nèi)存和驅(qū)動的需求更低。 今天給大家分享一組Blender格式的資源,56個原神角色模型,2K高清貼圖,帶骨

    2024年02月11日
    瀏覽(32)
  • Unity 卡通渲染之角色篇

    Unity 卡通渲染之角色篇

    作為新博客的第一篇,就用卡渲作為開篇叭!畢竟是個二次元樂。本篇同步發(fā)表于http://chenglixue.top/index.php/unity/73/ 之前使用UE的后處理做過簡單的卡渲,但因其靈活性很差,很多操作都需涉及到更改管線,且奈何本人在校用的筆記本,一次build就得好久,因此放棄對卡渲的深入

    2024年02月05日
    瀏覽(29)
  • 【Unity實戰(zhàn)系列】如何把你的二次元老婆/老公導(dǎo)入Unity進行二創(chuàng)并且進行二次元渲染?(附模型網(wǎng)站分享)

    【Unity實戰(zhàn)系列】如何把你的二次元老婆/老公導(dǎo)入Unity進行二創(chuàng)并且進行二次元渲染?(附模型網(wǎng)站分享)

    君兮_的個人主頁 即使走的再遠,也勿忘啟程時的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,在正式開始講主線知識之前,我們先來講點有趣且有用的東西。 我知道,除了很多想從事游戲開發(fā)行業(yè)的人以外,還有更多的人學(xué)習(xí)Unity是因為興趣愛好,想要讓自己喜歡的角

    2024年02月12日
    瀏覽(25)
  • 【unity游戲開發(fā)教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和動畫,在unity中簡單制作二次元人物動畫

    【unity游戲開發(fā)教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和動畫,在unity中簡單制作二次元人物動畫

    大家好!本期教程教大家在unity中制作二次元人物模型和動畫 1.下載VRoid Studio 1.搜索VRoid Studio下載即可,或者前往官網(wǎng)VRoid官網(wǎng) VRoid Studio是由pixiv開發(fā)的一款3D人物建模軟件,VRoid的主要特征就是通過類似繪畫的方式進行人物的建模,使人們更為輕松地創(chuàng)造自己的虛擬人物。

    2024年02月10日
    瀏覽(34)
  • ai繪畫二次元美女圖片怎么制作,試試這三個方法

    ai繪畫二次元美女圖片怎么制作,試試這三個方法

    只要通過輸入簡單的文字描述,就可以得到多張高質(zhì)量的藝術(shù)作品,怎么會有人錯過這樣的神仙工具! 我建議沒用過的小伙伴都可以嘗試一下,生圖效果是真的很棒! 下面先給大家欣賞幾張ai繪畫風(fēng)格不同的圖片~ 看完我相信大家也心動了,下面馬上分享三個簡單易操作的

    2024年02月08日
    瀏覽(35)
  • unity NPR 卡通渲染

    unity NPR 卡通渲染

    NPR是計算機圖形學(xué)中的一類,即非真實感繪制(Non-photorealistic rendering),主要用于模擬藝術(shù)式的繪制風(fēng)格,也用于發(fā)展新繪制風(fēng)格,形式一般是卡通造影。 NPR是Unity中的一種非真實渲染技術(shù),它使用一種稱為\\\"NPR\\\"的算法來模擬非真實渲染效果。這種技術(shù)可以用于制作各種類型的

    2024年02月05日
    瀏覽(25)
  • unity+webgl+websocket實時口型+二次元語音老婆

    unity+webgl+websocket實時口型+二次元語音老婆

    文章開始首先感謝 B站UP:?陰沉的怪咖?提供的最初資源包 2.gif 體驗地址 體驗地址?www.aixmao.com 不能放視頻,看效果去B站鏈接:B站鏈接_bilibili UP主提供初始代碼地址: Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit 2、LipSy

    2024年02月02日
    瀏覽(33)
  • Unity-Chan Toon Shader卡通渲染學(xué)習(xí)

    Unity-Chan Toon Shader卡通渲染學(xué)習(xí)

    (本文記錄一下從0-1復(fù)刻UTS2,持續(xù)更新中) Unity-Chan Toon Shader? 2.0 (UTS2) ?是一款用于圖像和視頻的卡通著色器,旨在滿足從事卡通著色 3DCG 動畫的創(chuàng)作者的需求。 UTS2開源項目地址: GitHub - unity3d-jp/UnityChanToonShaderVer2_Project: UnityChanToonShaderVer2 Project / v.2.0.9 Release (1)3 Bas

    2024年02月04日
    瀏覽(27)
  • 【Unity天空盒】卡通渲染中如何實現(xiàn)云的消散效果

    【Unity天空盒】卡通渲染中如何實現(xiàn)云的消散效果

    寫在前面 完成大氣渲染之后,接下來就是考慮云渲染了。因為我想做的天空盒本身是想跟著這位大佬Unity 卡通渲染 程序化天空盒 - 知乎里敘述的進程來的,里面云實現(xiàn)的是原神里的云,原神又是在崩3的基礎(chǔ)上加上了消散效果。但現(xiàn)在能找到的一些教程or展示的視頻里,很多

    2023年04月08日
    瀏覽(46)
  • 【Unity ShaderGraph】| 快速制作一個 卡通陰影色塊效果

    【Unity ShaderGraph】| 快速制作一個 卡通陰影色塊效果

    前言 本文將使用ShaderGraph制作一個卡通陰影色塊的效果,可以直接拿到項目中使用。 對ShaderGraph還不了解的小伙伴可以參考這篇文章:【Unity ShaderGraph】| Shader Graph入門介紹 | 簡介 | 配置環(huán)境 | 窗口介紹 | 簡單案例 下面就開始看一下具體的制作流程,然后自己動手制作一個吧

    2024年02月06日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包