From a7261d80da2e6d1360a2d2a60dce6ad9460f3c21 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Mon, 1 Jul 2024 12:01:30 +0800 Subject: [PATCH] vault backup: 2024-07-01 12:01:30 --- 02-Note/DAWA/ASoul/渲染方案/材质部分.md | 2 - .../渲染功能/描边/NomalEditor.mel | 639 ++++++++++++++++++ .../卡通渲染相关资料/渲染功能/描边/描边.md | 72 +- 3 files changed, 649 insertions(+), 64 deletions(-) create mode 100644 03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/NomalEditor.mel diff --git a/02-Note/DAWA/ASoul/渲染方案/材质部分.md b/02-Note/DAWA/ASoul/渲染方案/材质部分.md index 652c761..8f7a431 100644 --- a/02-Note/DAWA/ASoul/渲染方案/材质部分.md +++ b/02-Note/DAWA/ASoul/渲染方案/材质部分.md @@ -280,8 +280,6 @@ return Result; - M_Outline_V01 & M_Outline_V02: - **WPO**引脚逻辑:**描边粗细控制部分逻辑**和V01基本相同,除了V01有Minimum Line Thickness这个粗细最小值。剩下的其他逻辑一模一样。 - ***M_Outline_V03***: - - 主要实现功能: - - - **OpacityMask**引脚逻辑:与V01、V02略有不同。会将BaseTexture贴图的a通道乘以HideMask,然而并没有材质使用。 - **WPO**引脚逻辑:V03版本的**描边粗细控制部分逻辑**做了更加合理的改动。VertexColor的RGB通道代替Backface外扩时的VertexNormalWS,这样不会影响光照效果。 - MaterialInstance diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/NomalEditor.mel b/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/NomalEditor.mel new file mode 100644 index 0000000..c491ec3 --- /dev/null +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/NomalEditor.mel @@ -0,0 +1,639 @@ +global proc VertexColorToNormalCommand(int $num) +{ + if($num == 1) + { + string $colorSetsMenuItems[] = `optionMenu -q -ill VertexColorToNormalCurrentColorSet_optionMenu1`; + if(size($colorSetsMenuItems)) + { + deleteUI $colorSetsMenuItems; + } + + string $allColorSets[] = `polyColorSet -q -acs`; + if(size($allColorSets)>0) + { + for($name in $allColorSets) + { + menuItem -label $name -p VertexColorToNormalCurrentColorSet_optionMenu1 ; + } + } + string $CurrentColorSets[] = `polyColorSet -q -ccs`; + if(size($CurrentColorSets)) + { + optionMenu -e -v $CurrentColorSets[0] VertexColorToNormalCurrentColorSet_optionMenu1; + } + } + if($num == 2) + { + string $setName = `textField -q -tx VertexColorToNormalCreateColorSet_textField1`; + if(size($setName)) + { + polyColorSet -cr -cla 0 -rpt RGBA -cs $setName; + } + else + { + polyColorSet -cr -cla 0 -rpt RGBA -cs "colorSet" ; + } + VertexColorToNormalCommand 1; + } + if($num == 3) + { + string $currentVtxColorSet = `optionMenu -q -v VertexColorToNormalCurrentColorSet_optionMenu1`; + if(size($currentVtxColorSet)) + { + polyColorSet -delete -colorSet $currentVtxColorSet; + VertexColorToNormalCommand 1; + } + } + if($num == 4) + { + if(size(`ls -sl`)) + { + PolySelectConvert 3; + } + string $selVtx[] = `ls -sl -fl`; + progressWindow -t "ִн:" -pr 0 -st "ǰȣ 0%" -ii 1 -max (size($selVtx)); + //for($name in $selVtx) + for($i=0;$i= (size($selVtx)) ) break; + + float $vtxColor[] = `polyColorPerVertex -q -rgb $selVtx[$i]`; + polyNormalPerVertex -xyz $vtxColor[0] $vtxColor[1] $vtxColor[2] $selVtx[$i]; + + progressWindow -e -pr $i -st ("ǰ: "+($i/(size($selVtx)))+"%"); + } + progressWindow -ep; + } + if($num == 5) + { + if(size(`ls -sl`)) + { + PolySelectConvert 3; + } + string $selVtx[] = `ls -sl -fl`; + progressWindow -t "ִн:" -pr 0 -st "ǰȣ 0%" -ii 1 -max (size($selVtx)); + //for($name in $selVtx) + for($i=0;$i= (size($selVtx)) ) break; + + float $vtxVector[] = `polyNormalPerVertex -q -xyz $selVtx[$i]`; + polyColorPerVertex -rgb $vtxVector[0] $vtxVector[1] $vtxVector[2] $selVtx[$i]; + + progressWindow -e -pr $i -st ("ǰ: "+($i/(size($selVtx)))+"%"); + } + progressWindow -ep; + } +} +/* +global proc smoothNomalCommand() +{ + + if(size(`ls -sl`)) + { + PolySelectConvert 3; + } + string $selvtx[] = `ls -sl -fl`; + float $smoothNum = `floatSliderGrp -q -v nomalSmoothSet_floatSliderGrp1`; + for($i=0;$i= (size($selvtx)) ) break; + + select -r $selvtx[$i]; + polySelectConstraint -pp 1 -t 0x0001; + string $result[] = `ls -sl -fl`; + float $interimVector[]; + for($ii=0;$ii= (size($sel)) ) break; + + float $pointPossition[] = `pointPosition -w $sel[$i]`; + float $bigVector[],$SpherizeVector[]; + $bigVector[0] = $pointPossition[0] - $worldPossition[0]; + $bigVector[1] = $pointPossition[1] - $worldPossition[1]; + $bigVector[2] = $pointPossition[2] - $worldPossition[2]; + + float $max; + if(abs($bigVector[0])>abs($bigVector[1])) + { + $max = abs($bigVector[0]); + } + else + { + $max = abs($bigVector[1]); + } + if($max= (size($sel)) ) break; + + float $pointPossition[] = `pointPosition -w $sel[$i]`; + float $bigVector[],$SpherizeVector[]; + $bigVector[0] = $pointPossition[0] - $worldPossition[0]; + $bigVector[1] = $pointPossition[1] - $worldPossition[1]; + $bigVector[2] = $pointPossition[2] - $worldPossition[2]; + + float $max; + if(abs($bigVector[0])>abs($bigVector[1])) + { + $max = abs($bigVector[0]); + } + else + { + $max = abs($bigVector[1]); + } + if($max= (size($sel)) ) break; + + if(`match ".vtx" $sel[$i]`!=".vtx") + { + warning -n "===Ҫѡģ͵ٽв==="; + break; + } + + float $lkdasfljasdfje[] = `polyNormalPerVertex -q -xyz $sel[$i]`; + if($EditMode == 1) + { + polyNormalPerVertex -xyz ($lkdasfljasdfje[0] + $EditValue) $lkdasfljasdfje[1] $lkdasfljasdfje[2] $sel[$i]; + } + else if($EditMode == 2) + { + polyNormalPerVertex -xyz ($lkdasfljasdfje[0] * (1+$EditValue)) $lkdasfljasdfje[1] $lkdasfljasdfje[2] $sel[$i]; + } + progressWindow -e -pr $i -st ("ǰ: "+($i/(size($sel)))+"%"); + } + progressWindow -ep; + } + else if($num == 2) + { + progressWindow -t "ִн:" -pr 0 -st "ǰȣ 0%" -ii 1 -max (size($sel)); + for($i=0;$i= (size($sel)) ) break; + + if(`match ".vtx" $sel[$i]`!=".vtx") + { + warning -n "===Ҫѡģ͵ٽв==="; + break; + } + + float $lkdasfljasdfje[] = `polyNormalPerVertex -q -xyz $sel[$i]`; + if($EditMode == 1) + { + polyNormalPerVertex -xyz $lkdasfljasdfje[0] ($lkdasfljasdfje[1] + $EditValue) $lkdasfljasdfje[2] $sel[$i]; + } + else if($EditMode == 2) + { + polyNormalPerVertex -xyz $lkdasfljasdfje[0] ($lkdasfljasdfje[1] * (1+$EditValue)) $lkdasfljasdfje[2] $sel[$i]; + } + progressWindow -e -pr $i -st ("ǰ: "+($i/(size($sel)))+"%"); + } + progressWindow -ep; + } + else if($num == 3) + { + progressWindow -t "ִн:" -pr 0 -st "ǰȣ 0%" -ii 1 -max (size($sel)); + for($i=0;$i= (size($sel)) ) break; + + if(`match ".vtx" $sel[$i]`!=".vtx") + { + warning -n "===Ҫѡģ͵ٽв==="; + break; + } + + float $lkdasfljasdfje[] = `polyNormalPerVertex -q -xyz $sel[$i]`; + if($EditMode == 1) + { + polyNormalPerVertex -xyz $lkdasfljasdfje[0] $lkdasfljasdfje[1] ($lkdasfljasdfje[2] + $EditValue) $sel[$i]; + } + else if($EditMode == 2) + { + polyNormalPerVertex -xyz $lkdasfljasdfje[0] $lkdasfljasdfje[1] ($lkdasfljasdfje[2] * (1+$EditValue)) $sel[$i]; + } + progressWindow -e -pr $i -st ("ǰ: "+($i/(size($sel)))+"%"); + } + progressWindow -ep; + } + +} + +global proc EditVertixNomalUI() +{ + if(`window -ex EditVertixNomalWin`) + { + deleteUI EditVertixNomalWin; + } + window -t "֮߱༭V1.0" EditVertixNomalWin; + window -e -wh 400 646 EditVertixNomalWin; + columnLayout -adj 1 -bgc 0.18 0.18 0.18 EditVertixNomalMain_columnLayout1; + separator -h 10 EditVertixNomal_separator0; + text -l "ƫ" -bgc 0 0 0 nomalOffset_text1; + + separator -h 10 EditVertixNomal_separator1; + + formLayout -nd 100 nomalOffset_formLayout1; + radioButtonGrp -nrb 2 -l "㷨" -la2 "" "" -cal 1 "center" -sl 1 nomalOffset_radioButtonGrp1; + + floatSliderGrp -l ":" -f true -cal 1 "center" + -min -1.0 -max 1.0 -fmn -10.0 -fmx 10.0 -v 0.2 + -s 0.01 nomalOffsetNum_floatSliderGrp1; + + button -l "X" -c "nomalOffsetxyzCommand 1;" nomalOffsetx_button1; + button -l "Y" -c "nomalOffsetxyzCommand 2;" nomalOffsety_button1; + button -l "Z" -c "nomalOffsetxyzCommand 3;" nomalOffsetz_button1; + + formLayout -e + -af nomalOffset_radioButtonGrp1 "left" 1 + -af nomalOffset_radioButtonGrp1 "right" 1 + + -af nomalOffsetNum_floatSliderGrp1 "left" 1 + -af nomalOffsetNum_floatSliderGrp1 "right" 1 + -ac nomalOffsetNum_floatSliderGrp1 "top" 5 nomalOffset_radioButtonGrp1 + + -af nomalOffsetx_button1 "left" 1 + -ap nomalOffsetx_button1 "right" 3 33 + -ac nomalOffsetx_button1 "top" 5 nomalOffsetNum_floatSliderGrp1 + + -ac nomalOffsety_button1 "left" 3 nomalOffsetx_button1 + -ap nomalOffsety_button1 "right" 3 66 + -ac nomalOffsety_button1 "top" 5 nomalOffsetNum_floatSliderGrp1 + + -ac nomalOffsetz_button1 "left" 3 nomalOffsety_button1 + -af nomalOffsetz_button1 "right" 1 + -ac nomalOffsetz_button1 "top" 5 nomalOffsetNum_floatSliderGrp1 + + nomalOffset_formLayout1; + + setParent EditVertixNomalMain_columnLayout1; + separator -h 10 EditVertixNomal_separator2; + + text -l "䷨" -bgc 0 0 0 nomalOffsetSpherize_text1; + separator -h 10 EditVertixNomal_separator3; + formLayout -nd 100 nomalOffsetSpherize_formLayout1; + + button -l "" -c "nomalOffsetSpherizeCommand 1" -ann "һΪĶλĶλ" createNormalCenter_button1; + button -l "ɾ" -c "nomalOffsetSpherizeCommand 11" deleteNormalCenter_button1; + + floatSliderGrp -l ":" -f true -cal 1 "center" + -min 0 -max 1.0 -fmn 0 -fmx 1 -v 0.2 + -s 0.01 nomalOffsetSpherizeNum_floatSliderGrp1; + + button -l "" -c "nomalOffsetSpherizeCommand 2" aggregationVertixNomal_button1; + button -l "£" -c "nomalOffsetSpherizeCommand 3" dispersedVertixNomal_button1; + + formLayout -e + + -af createNormalCenter_button1 "left" 1 + -ap createNormalCenter_button1 "right" 3 50 + + -ac deleteNormalCenter_button1 "left" 3 createNormalCenter_button1 + -af deleteNormalCenter_button1 "right" 1 + + -af nomalOffsetSpherizeNum_floatSliderGrp1 "left" 1 + -af nomalOffsetSpherizeNum_floatSliderGrp1 "right" 1 + -ac nomalOffsetSpherizeNum_floatSliderGrp1 "top" 1 createNormalCenter_button1 + + -af aggregationVertixNomal_button1 "left" 1 + -ap aggregationVertixNomal_button1 "right" 3 50 + -ac aggregationVertixNomal_button1 "top" 1 nomalOffsetSpherizeNum_floatSliderGrp1 + + -ac dispersedVertixNomal_button1 "left" 3 aggregationVertixNomal_button1 + -af dispersedVertixNomal_button1 "right" 1 + -ac dispersedVertixNomal_button1 "top" 1 nomalOffsetSpherizeNum_floatSliderGrp1 + + nomalOffsetSpherize_formLayout1; + + setParent EditVertixNomalMain_columnLayout1; + separator -h 10 EditVertixNomal_separator4; + + text -l "ƽ" -bgc 0 0 0 nomalSmoothSet_text1; + + separator -h 10 EditVertixNomal_separator5; + formLayout -nd 100 nomalSmoothSet_formLayout1; + + floatSliderGrp -l ":" -f true -cal 1 "center" + -min 0 -max 1.0 -fmn 0 -fmx 1 -v 0.2 + -s 0.01 nomalSmoothSet_floatSliderGrp1; + + button -l "ƽ" -c "smoothNomalCommand" nomalSmoothSet_button1; + + formLayout -e + + -af nomalSmoothSet_floatSliderGrp1 "left" 1 + -af nomalSmoothSet_floatSliderGrp1 "right" 1 + + -af nomalSmoothSet_button1 "left" 1 + -af nomalSmoothSet_button1 "right" 1 + -ac nomalSmoothSet_button1 "top" 5 nomalSmoothSet_floatSliderGrp1 + + nomalSmoothSet_formLayout1; + + + setParent EditVertixNomalMain_columnLayout1; + separator -h 10 EditVertixNomal_separator6; + + formLayout -nd 100 nomalOffsetReset_formLayout1; + button -l "" -c "polySetToFaceNormal" nomalOffsetReset_button1; + button -l "" -c "polyAverageNormal -d 0" nomalOffsetSmooth_button1; + button -l "ʾ" -c "polyOptions -dn 1 -pt" disPlayNormal_button1; + button -l "ط" -c "polyOptions -dn 0 -pt" hideNormal_button1; + floatSliderGrp -l "߳:" -f true -cal 1 "center" + -min 0 -max 10.0 -fmn 0 -fmx 10 -v 0.3 + -s 0.01 -cc ("polyOptions -activeObjects -sizeNormal `floatSliderGrp -q -v nomalSizeSet_floatSliderGrp1`") nomalSizeSet_floatSliderGrp1; + + formLayout -e + + -af nomalOffsetReset_button1 "left" 1 + -ap nomalOffsetReset_button1 "right" 3 50 + + -ac nomalOffsetSmooth_button1 "left" 3 nomalOffsetReset_button1 + -af nomalOffsetSmooth_button1 "right" 1 + + -af nomalSizeSet_floatSliderGrp1 "left" 1 + -af nomalSizeSet_floatSliderGrp1 "right" 1 + -ac nomalSizeSet_floatSliderGrp1 "top" 3 nomalOffsetSmooth_button1 + + -af disPlayNormal_button1 "left" 1 + -ap disPlayNormal_button1 "right" 3 50 + -ac disPlayNormal_button1 "top" 3 nomalSizeSet_floatSliderGrp1 + + -ac hideNormal_button1 "left" 3 disPlayNormal_button1 + -af hideNormal_button1 "right" 1 + -ac hideNormal_button1 "top" 3 nomalSizeSet_floatSliderGrp1 + + + + nomalOffsetReset_formLayout1; + + setParent EditVertixNomalMain_columnLayout1; + + separator -h 10 EditVertixNomal_separator7; + + text -l "ɫ <=> " -bgc 0 0 0 VertexColorToNormal_text1; + + formLayout -nd 100 VertexColorToNormal_formLayout1; + + separator -h 10 VertexColorToNormalCurrentColorSet_separator1; + + optionMenu -l "ǰɫ" -cc ("polyColorSet -ccs -cs `optionMenu -q -v VertexColorToNormalCurrentColorSet_optionMenu1`") VertexColorToNormalCurrentColorSet_optionMenu1; + button -l "ˢ" -c "VertexColorToNormalCommand 1" VertexColorToNormalRefreshColorSet_button1; + + text -l "" VertexColorToNormalCreateColorSet_text1; + textField -text "" VertexColorToNormalCreateColorSet_textField1; + button -l "½ɫ" -c "VertexColorToNormalCommand 2" VertexColorToNormalCreateColorSet_button1; + + button -l "ɾǰɫ" -c "VertexColorToNormalCommand 3" VertexColorToNormalDeleteColorSet_button1; + + separator -h 10 VertexColorToNormalCurrentColorSet_separator2; + + button -l "ƶɫ" -c "PaintVertexColorTool" VertexColorToNormalDrawVertexColor_button1; + + button -l "" -c "toolPropertyWindow" VertexColorToNormalDrawVertexToolSet_button1; + + button -l "ɫ=>" -c "VertexColorToNormalCommand 4" VertexColorToNormalConvertToNormal_button1; + + button -l "=>ɫ" -c "VertexColorToNormalCommand 5" VertexColorToNormalConvertToVertexColor_button1; + + separator -h 10 VertexColorToNormalCurrentColorSet_separator3; + + formLayout -e + + -af VertexColorToNormalCurrentColorSet_separator1 "left" 1 + -af VertexColorToNormalCurrentColorSet_separator1 "right" 1 + + -af VertexColorToNormalCurrentColorSet_optionMenu1 "left" 1 + -af VertexColorToNormalCurrentColorSet_optionMenu1 "right" 100 + -ac VertexColorToNormalCurrentColorSet_optionMenu1 "top" 5 VertexColorToNormalCurrentColorSet_separator1 + + -ac VertexColorToNormalRefreshColorSet_button1 "left" 3 VertexColorToNormalCurrentColorSet_optionMenu1 + -af VertexColorToNormalRefreshColorSet_button1 "right" 1 + -ac VertexColorToNormalRefreshColorSet_button1 "top" 5 VertexColorToNormalCurrentColorSet_separator1 + + -af VertexColorToNormalCreateColorSet_textField1 "left" 55 + -af VertexColorToNormalCreateColorSet_textField1 "right" 100 + -ac VertexColorToNormalCreateColorSet_textField1 "top" 5 VertexColorToNormalCurrentColorSet_optionMenu1 + + -af VertexColorToNormalCreateColorSet_text1 "left" 1 + -ac VertexColorToNormalCreateColorSet_text1 "right" 3 VertexColorToNormalCreateColorSet_textField1 + -ac VertexColorToNormalCreateColorSet_text1 "top" 5 VertexColorToNormalCurrentColorSet_optionMenu1 + + -ac VertexColorToNormalCreateColorSet_button1 "left" 3 VertexColorToNormalCreateColorSet_textField1 + -af VertexColorToNormalCreateColorSet_button1 "right" 1 + -ac VertexColorToNormalCreateColorSet_button1 "top" 5 VertexColorToNormalCurrentColorSet_optionMenu1 + + -af VertexColorToNormalDeleteColorSet_button1 "left" 1 + -af VertexColorToNormalDeleteColorSet_button1 "right" 1 + -ac VertexColorToNormalDeleteColorSet_button1 "top" 5 VertexColorToNormalCreateColorSet_button1 + + -af VertexColorToNormalCurrentColorSet_separator2 "left" 1 + -af VertexColorToNormalCurrentColorSet_separator2 "right" 1 + -ac VertexColorToNormalCurrentColorSet_separator2 "top" 1 VertexColorToNormalDeleteColorSet_button1 + + -af VertexColorToNormalDrawVertexColor_button1 "left" 1 + -ap VertexColorToNormalDrawVertexColor_button1 "right" 3 50 + -ac VertexColorToNormalDrawVertexColor_button1 "top" 5 VertexColorToNormalCurrentColorSet_separator2 + + -ac VertexColorToNormalDrawVertexToolSet_button1 "left" 3 VertexColorToNormalDrawVertexColor_button1 + -af VertexColorToNormalDrawVertexToolSet_button1 "right" 1 + -ac VertexColorToNormalDrawVertexToolSet_button1 "top" 5 VertexColorToNormalCurrentColorSet_separator2 + + -af VertexColorToNormalConvertToNormal_button1 "left" 1 + -ap VertexColorToNormalConvertToNormal_button1 "right" 3 50 + -ac VertexColorToNormalConvertToNormal_button1 "top" 5 VertexColorToNormalDrawVertexToolSet_button1 + + -ac VertexColorToNormalConvertToVertexColor_button1 "left" 3 VertexColorToNormalConvertToNormal_button1 + -af VertexColorToNormalConvertToVertexColor_button1 "right" 1 + -ac VertexColorToNormalConvertToVertexColor_button1 "top" 5 VertexColorToNormalDrawVertexToolSet_button1 + + -af VertexColorToNormalCurrentColorSet_separator3 "left" 1 + -af VertexColorToNormalCurrentColorSet_separator3 "right" 1 + -ac VertexColorToNormalCurrentColorSet_separator3 "top" 1 VertexColorToNormalConvertToVertexColor_button1 + + VertexColorToNormal_formLayout1; + + showWindow EditVertixNomalWin; + + VertexColorToNormalCommand 1; +} +EditVertixNomalUI; diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/描边.md b/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/描边.md index 3418dd2..8530493 100644 --- a/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/描边.md +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/描边/描边.md @@ -50,69 +50,17 @@ Robert算子被应用到图像增强总的锐化,其作为一阶微分算子Ro # 实现记录 [[OutlinePass]] + +# BackFace描边 + +## 调整法线插件 +### Blender +【【Blender】三渲二动漫角色脸部法线修改教程】 https://www.bilibili.com/video/BV1bX4y1y7pP/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e + +### Maya +法线编辑工具:https://www.bilibili.com/video/BV1uW411w7tp/?spm_id_from=333.337.search-card.all.click&vd_source=d47c0bb42f9c72fd7d74562185cee290 +作者还提供代码:![[NomalEditor.mel]] # 杂项 -## 李兄实现Outline思路 -### Depth与Normal描边 -ToonOutlineMain() -```c++ -float3x3 laplacianOperator = float3x3(-1, -1, -1, - -1, 8, -1, -float3x3 Gx = float3x3( -1, +0, +1, - -1, -1, -1); - -2, +0, +2, - -1, +0, +1); -float3x3 Gy = float3x3( +1, +2, +1, - +0, +0, +0, - -1, -2, -1); -``` -使用GetPixelValue()取得Normal与Depth,之后使用拉普拉斯算子与Sobel算子进行边缘检测: -```c++ -float4 fs0 = s0 * laplacianOperator[0][0]; -float4 fs1 = s1 * laplacianOperator[0][1]; -float4 fs2 = s2 * laplacianOperator[0][2]; -float4 fs3 = s3 * laplacianOperator[1][0]; -float4 fs4 = s4 * laplacianOperator[1][1]; -float4 fs5 = s5 * laplacianOperator[1][2]; -float4 fs6 = s6 * laplacianOperator[2][0]; -float4 fs7 = s7 * laplacianOperator[2][1]; -float4 fs8 = s8 * laplacianOperator[2][2]; - -float4 sampledValue = fs0 + fs1 + fs2 + fs3 + fs4 + fs5 + fs6 + fs7 + fs8; -OutlineMask0 = saturate(1.0 - length(sampledValue)); //Line is black -``` -```c++ -float4 ds0x = s0 * Gx[0][0]; -float4 ds1x = s1 * Gx[0][1]; -float4 ds2x = s2 * Gx[0][2]; -float4 ds3x = s3 * Gx[1][0]; -float4 ds4x = s4 * Gx[1][1]; -float4 ds5x = s5 * Gx[1][2]; -float4 ds6x = s6 * Gx[2][0]; -float4 ds7x = s7 * Gx[2][1]; -float4 ds8x = s8 * Gx[2][2]; -float4 SGX = ds0x + ds1x + ds2x + ds3x + ds4x + ds5x + ds6x + ds7x + ds8x; - -float4 ds0y = s0 * Gy[0][0]; -float4 ds1y = s1 * Gy[0][1]; -float4 ds2y = s2 * Gy[0][2]; -float4 ds3y = s3 * Gy[1][0]; -float4 ds4y = s4 * Gy[1][1]; -float4 ds5y = s5 * Gy[1][2]; -float4 ds6y = s6 * Gy[2][0]; -float4 ds7y = s7 * Gy[2][1]; -float4 ds8y = s8 * Gy[2][2]; -float4 SGY = ds0y + ds1y + ds2y + ds3y + ds4y + ds5y + ds6y + ds7y + ds8y; - -OutlineMask1 = saturate(2.0 - step(0.9, length(sqrt(SGX * SGX + SGY * SGY)))); -``` -这个算法巧妙的地方在于对计算卷积核之后使用length(float4(Normal,Depth))来取得结果;Sobel也是:length(sqrt(SGX * SGX + SGY * SGY)。 - -最后使用```OutColor.rgba = OutlineMask0;//lerp(OutlineMask0, OutlineMask1, 0.5);```进行混合。使用OutlineIDMap.a作为宽度控制项,并乘以通过Depth重映射后的变量作为宽度Fix因子。 - -### ID描边 -对ToonIDTexture进行Sobel描边。(只使用了Sobel) - -### 混合结果 ## 蓝色协议的做法 ### 模型外扩