{"id":1771,"date":"2026-07-03T15:06:41","date_gmt":"2026-07-03T07:06:41","guid":{"rendered":"https:\/\/ferina.top\/?p=1771"},"modified":"2026-07-13T23:06:22","modified_gmt":"2026-07-13T15:06:22","slug":"wuwa-frame-analyze","status":"publish","type":"post","link":"https:\/\/ferina.top\/index.php\/2026\/07\/03\/wuwa-frame-analyze\/","title":{"rendered":"Wuwa frame analyze"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u514d\u8d23\u58f0\u660e\uff1a\u672c\u6b21\u622a\u5e27\u5206\u6790\u57fa\u4e8ewuthering waves \u7684 runtime frame\u5206\u6790\u3002\u4f18\u5148\u5206\u6790\u89d2\u8272shader\uff0c\u56e0\u6b64\u9009\u53d6\u7684\u622a\u5e27\u573a\u666f\u4e3a\u89d2\u8272\u5c55\u793a\u754c\u9762\u3002\u4ec5\u4f9b\u4e2a\u4eba\u5b66\u4e60\uff0c\u672a\u7528\u4e8e\u5546\u4e1a\u7528\u9014\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Overview<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ecerenderpass\u4e0a\u6765\u770b\uff0c\u5b8c\u6574\u7684render\u6d41\u7a0b\u53ef\u4ee5\u62c6\u5206\u4e3a\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>compute pass 1<\/li>\n\n\n\n<li>color pass 1<\/li>\n\n\n\n<li><strong>color pass 2<\/strong> basepass \u8d1f\u8d23gbuffer\uff1a 1 * final rt + 6 * data rt + 1 * Depth<\/li>\n\n\n\n<li>depth &#8211; only pass 1 + compute pass 2<\/li>\n\n\n\n<li>depth &#8211; only pass 2 (shadow map)<\/li>\n\n\n\n<li>depth &#8211; only pass 3 produce \u4e00\u4e2a10240 * 2048 \u7684 D16 buffer<\/li>\n\n\n\n<li>some unused draw + color pass 3<\/li>\n\n\n\n<li><strong>light composite<\/strong> \u63a5\u6536 5 * data rt\uff0c\u8f93\u51fa\u5230 final rt<\/li>\n\n\n\n<li>color pass 4 \u7279\u6548\u5408\u6210pass<\/li>\n\n\n\n<li>DOF \u666f\u6df1 <\/li>\n\n\n\n<li>TAA <\/li>\n\n\n\n<li>Motion Blur \u8fd0\u52a8\u6a21\u7cca<\/li>\n\n\n\n<li>Bloom <\/li>\n\n\n\n<li><strong>color pass 5<\/strong>\uff1alinear to RGB + UI painting  <\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u7a0b\u4e2d\u542b\u6709\u5927\u91cf\u7684compute shader\u4f18\u5316\u5185\u5bb9\uff0c\u4ee5\u53ca\u7591\u4f3ccompatible\u6b8b\u7559\u4e0b\u6765\u7684\uff0cunused feature<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. BasePass<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u7ec4\u6210\u89d2\u8272\u7684\u7ec4\u4ef6\uff08\u4ee5daniya\u4e3a\u4f8b\u8bf4\u660e\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">face01\uff0812948\uff09- \u81ea\u7136\u662f\u8138  draw\u4e24\u6b21\uff0c\u6709outline<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fur\uff0810902\uff09 &#8211; \u62ab\u80a9\u6bdb\u8338\u8338\u6548\u679c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">up01\uff0859412\uff09- \u89d2\u8272body<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">down01\uff0854150\uff09- \u89d2\u8272\u6b63\u9762\u8863\u88d9<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cloth\uff0883844\uff09- \u89d2\u8272\u8863\u670d\uff0c\u662f\u9762\u6570\u6700\u591a\u7684\u7ec4\u4ef6<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">eye01\uff081530\uff09- draw\u4e24\u6b21\uff0c\u4f46\u6ca1\u6709outline<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bangs\uff08\u5218\u6d77\uff1f\u4f46\u5b9e\u9645\u662f\u6574\u4e2a\u5934\u53d1\uff09 &#8211; \u7279\u6b8a\u5904\u7406\uff0c\u88abdraw\u4e863\u904d\uff08\u4e0d\u7b97outline\uff09<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7b2c\u4e00\u6b21draw\u53ea\u5199\u5165\u4e86normal rt\u7684B\u901a\u9053\uff0c\u7528\u4e8e\u5904\u7406\u5218\u6d77\u4ea7\u751f\u7684\u9762\u90e8\u9634\u5f71<\/li>\n\n\n\n<li>\u7b2c\u4e8c\u6b21draw\u662f\u4e3b\u4f53draw<\/li>\n\n\n\n<li>\u7b2c\u4e09\u6b21draw\u9632\u6b62eye\u8986\u76d6\u5728bang\u4e0a\u9762<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">hair01 &#8211; \u6b63\u5e38\u7684 draw 1\u6b21<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uff08bangs hair01 down01 cloth face01 up01 \u6709 outline draw\uff0c fur eye01\u6ca1\u6709\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u90e8\u4ef6\u5bf9\u5e94\u7684shader\u53ef\u4ee5\u5f52\u7c7b\u4e3a3\u4e2a\u57fa\u7c7b\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MSM_ToonCommon\uff1aup down fur cloth \u6700\u590d\u6742\u7684shader 3000 &#8211; 5000 dxil lines<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MSM_ToonHair\uff1ahair bangs 3000 lines\uff08bangs\u7684\u7b2c\u4e00\u4e2adraw\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u6709300 lines\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MSM_ToonFace\uff1aeye01 face01 \u7b2c\u4e00\u6b211000 &#8211; 2000 dxil lines \u7b2c\u4e8c\u6b21500lines\uff08\u4f46\u8fd9\u4e2a\u7b2c\u4e8c\u6b21draw\u662funused\uff09<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. MSM_ToonCommon<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">shader\u7684texture slots\u6bd4\u8f83\u7edf\u4e00\uff0c\u4e0b\u9762\u4ee5cloth\u4e3a\u4f8b\u8bf4\u660e<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"767\" height=\"765\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1789\"  sizes=\"auto, (max-width: 767px) 100vw, 767px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_D.rgb diffuse<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"766\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1790\"  sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_D.a <\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_D.rgb\u662f\u57fa\u7840\u989c\u8272\u901a\u9053\uff0c\u6ca1\u4ec0\u4e48\u7279\u522b\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_D.a <strong>shadowWidth<\/strong> \u63a7\u5236\u9634\u5f71\u8fc7\u6e21\u533a\u57df\u5bbd\u5ea6  <code>Cloth_D.a<\/code> \u8d8a\u9ad8\uff0c<code>regionShadowWidth<\/code> \u8d8a\u5927\uff0c\u540e\u9762\u7684 ramp\/shadow \u8fc7\u6e21\u533a\u57df\u8d8a\u5bbd\uff0c\u9634\u5f71\u8fb9\u754c\u66f4\u8f6f\u3001\u66f4\u5c55\u5f00\uff1b<code>Cloth_D.a<\/code> \u8d8a\u4f4e\uff0c\u8fc7\u6e21\u8d8a\u7a84\uff0c\u9634\u5f71\u8fb9\u754c\u66f4\u786c\u6216\u66f4\u65e9\u88ab\u538b\u6389\u3002<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-4.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"633\" height=\"637\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-4.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1793\"  sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FTM.r <\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-3.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"636\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-3.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1792\"  sizes=\"auto, (max-width: 635px) 100vw, 635px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FTM.g<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-5.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"634\" height=\"635\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-5.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1794\"  sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FTM.b<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-6.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"633\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-6.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1795\"  sizes=\"auto, (max-width: 635px) 100vw, 635px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FTM.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">FTM\u662ftype mask\uff0c4\u901a\u9053\u627f\u8f7d\u7740\u4e0d\u540c\u7684\u4f5c\u7528<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>r\u901a\u9053\uff1a<code>FTM.r<\/code> \u8d8a\u9ad8\uff0c\u8be5\u50cf\u7d20\u8d8a\u4e0d\u5bb9\u6613\u88ab dither\/discard \u6389\uff1b\u503c\u8d8a\u4f4e\uff0c\u8d8a\u4f9d\u8d56\u9ad8\u5149\u4eae\u5ea6\u6216\u566a\u58f0\u51b3\u5b9a\u662f\u5426\u4fdd\u7559<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ftmR = Cloth_FTM.r;\n\nclipStrength = max(specLuminance, ftmR);\ndiscard if (clipStrength + noise + threshold &lt; 0);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>g\u901a\u9053\uff1ametallic\u8d34\u56fe\uff0c\u6700\u7ec8\u7684metallic\u662fregion id\u51b3\u5b9a\u7684metallic + g\u901a\u9053\u91c7\u6837\u51b3\u5b9a<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ftmG = Cloth_FTM.g;\n\npbrRate = regionMetallicBase + ftmG;\npbrRate = saturate(pbrRate * 1.11111);\n\nrampMultiplier.rgb =\n    1.0 + (rampColored.rgb * baseSpecTint.rgb - 1.0) * pbrRate;\n\nspecTerm.rgb =\n    lobeShape\n  * baseSpecTint.rgb\n  * rampMultiplier.rgb;\n\nextraSpec.rgb = max(specTerm.rgb * materialMask - 1.0, 0.0);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>b\u901a\u9053\uff1a<strong>\u6cd5\u7ebf\u7ec6\u8282\u7a0b\u5ea6<\/strong>\uff0c\u5373\u6cd5\u7ebf\u662f\u66f4\u63a5\u8fd1\u57fa\u7840\u6cd5\u7ebf\uff0c\u8fd8\u662f\u66f4\u63a5\u8fd1 Cloth_N.rg \u7684\u7ec6\u8282\u6cd5\u7ebf\u3002\u9009\u62e9\u903b\u8f91\u516c\u5f0f\uff1a\uff0c\u8bf4\u660e\u9ad8\u503c\u4f7f\u6cd5\u7ebf\u66f4\u9760\u8fd1\u57fa\u7840\/\u9876\u70b9\u6cd5\u7ebf\uff0c\u89c6\u89c9\u66f4\u5e73\uff1b\u4f4e\u503c\u4fdd\u7559\u66f4\u591a <code>Cloth_N.rg<\/code> \u7684\u7ec6\u8282\u3002\u5f53\u524dcloth\u4e2d\u6ca1\u6709\u542f\u52a8blend\uff0c\u4e5f\u5c31\u662f\u9ed8\u8ba4\u6cd5\u7ebf\u5168\u90e8\u6765\u81eaCloth_N.rg<\/li>\n\n\n\n<li>a\u901a\u9053\uff1a\u914d\u5408region id\uff0cchoose high or low<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ftmB = Cloth_FTM.b;\n\nnormalBlendMask =\n    saturate(cb4&#91;114].y * 2.00803 *\n    (cb4&#91;114].x * (ftmB - 0.5) - 0.00199997));\n\ndetailNormal = decodeNormal(Cloth_N.rg);\nfinalNormal = lerp(detailNormal, baseNormal, normalBlendMask);<\/code><\/pre>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-7.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"729\" height=\"733\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-7.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1796\"  sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_N.rg<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-8.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"731\" height=\"731\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-8.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1797\"  sizes=\"auto, (max-width: 731px) 100vw, 731px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_N.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_N.rg uv\u91c7\u6837\u7684\u7ec6\u8282\u6cd5\u7ebf<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_N.a roughness\u63a7\u5236\uff0c\u5f71\u54cd\u9ad8\u5149\u533a\u57df\u548cflowmap\u91c7\u6837LOD\u3002\u53ef\u4ee5\u770b\u5230\uff0ca\u901a\u9053\u8d8a\u63a5\u8fd1 1 \u8bf4\u660eLOD\u8d8a\u9ad8\uff0c\u4e5f\u5c31\u662f\u91c7\u6837\u7684\u8d8a\u6a21\u7cca\uff0c\u6700\u7ec8\u54cd\u5e94\u5c31\u8d8a\u4f4e\u9891\uff0c\u4ee3\u8868roughness\u63d0\u9ad8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>response = saturate_to_0_1(\n    clamp(regionRoughness + Cloth_N.a, 0.0, 0.9) \/ 0.9\n);\nrampLOD = 4.0 + 1.2 * log2(max(response, 0.001));\n\nresponse = 1.0   -&gt; LOD = 4.00\nresponse = 0.5   -&gt; LOD = 2.80\nresponse = 0.25  -&gt; LOD = 1.60\nresponse = 0.1   -&gt; LOD = 0.01\nresponse = 0.001 -&gt; LOD = -7.96\uff0c\u5b9e\u9645\u63a5\u8fd1\u6700\u6e05\u6670 mip<\/code><\/pre>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_high4_id_labels-1024x1024.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_high4_id_labels-1024x1024.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1800\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RGID_high4<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_low4_id_labels-1024x1024.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_low4_id_labels-1024x1024.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1801\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RGID_low4<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_selected_id_labels-1024x1024.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_R2T1DaniyaMd10011Cloth_RGID_selected_id_labels-1024x1024.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1802\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RGID_selcted<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">RGID\u8d34\u56fe\uff0c\u4e0e Cloth_FTM \u8d34\u56fe\u7684a\u901a\u9053\u914d\u5408\u4f7f\u7528\u3002\u5176\u672c\u8eab\u6bcf\u4e2a\u50cf\u7d20\u662f8bit\u7684\u5355\u901a\u9053\u503c\uff0c\u524d\u97624bits\u548c\u540e\u97624bits\u5206\u522b\u7f16\u7801\u4e24\u7ec4region id\uff0c\u5373\u5982\u4e0a\u56fe\u6240\u793a\u3002region id\u8303\u56f4\u662f 0 &#8211; 4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">decode\u65f6\uff0c\u9700\u8981\u7ecf\u8fc7\u4e00\u4e2a\u5224\u65ad\uff1a\u5f53Cloth_FTM.a\u5927\u4e8e0.5\uff0c\u5373\u767d\u8272\u533a\u57df\uff0cchoose high\uff1b\u53cd\u4e4bchoose low\u3002\u6700\u7ec8\u7684region id\u5982\u4e0a\u53f3\u56fe\u6240\u793a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">region id\u7ed1\u5b9a\u4e86\u4e00\u7ec4\u5bf9\u5e94\u7684\u53c2\u6570\u96c6\u5408\u3002\u4eceCloth\u5bf9\u5e94\u7684\u6750\u8d28\u5b9e\u4f8b\uff08Material Instance\uff09\u6765\u770b\uff0c\u50cf\u662f\u8fd9\u6837\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">id 0: RampID 2, RampInt 0.7, ShadowWidth 0.1, Metallic -0.2, Roughness 0.2, Spec_Int 1, Spec_Smooth 1.0, Spec_Width 0.5<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-9.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"695\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-9.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1818\"  sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Normal_Flowmap_40001_2.rgb<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-10.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"696\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-10.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1820\"  sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Normal_Flowmap_40001_2.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Rim light feature<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e8c\u9009\u4e00\uff1a\u5f53\u524d\u60c5\u51b5\u4e0b\uff0cregion id\u51b3\u5b9a\u4e86regionRampMask\uff0c\u4e5f\u5c31\u51b3\u5b9a\u4e86\u662f\u9009\u62e9\u8fd9\u91cc\u7684\u5f69\u8272\u9879\uff0c\u8fd8\u662f\u7070\u5ea6\u9879<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">region id 0: \u4f7f\u7528 Normal_Flowmap_40001_2.rgb \u8ba9\u88d9\u5b50\u7c89\u8272\u7684\u90e8\u5206\u66f4\u5bcc\u6709\u5f69\u8272\u53d8\u5316<br>region id 1-4: \u66f4\u503e\u5411\u4f7f\u7528 Normal_Flowmap_40001_2.a \u7070\u5ea6<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u91c7\u6837\u503c\u6765\u6e90\u4e8e\uff1a<strong>\u6cd5\u7ebf\u6b63\u5bf9\u955c\u5934\u7684\u7a0b\u5ea6<\/strong>\uff0c\u4e5f\u5c31\u662f\u5f53\u6cd5\u7ebf\u6b63\u5bf9\u955c\u5934\u662f\uff0c\u53d6texture\u6b63\u4e2d\u592e\uff1b\u5f53\u6cd5\u7ebf\u8fd1\u4f3c\u4e8e\u955c\u5934\u5782\u76f4\u7684\u65f6\u5019\uff0c\u53d6texture\u6700\u8fb9\u7f18\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e24\u4e2a\u7ed3\u8bba\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u88d9\u5b50\u7c89\u8272\u90e8\u5206\uff08id 0\uff09\u66f4\u63a5\u8fd1\u6f2b\u53cd\u5c04\u989c\u8272\uff0crim light\u90e8\u5206\u7279\u6027\u4e0d\u660e\u663e<\/li>\n\n\n\n<li>\u5176\u4ed6\u90e8\u5206\u7684rim light\u9879\u6ca1\u6709\u989c\u8272\u503e\u5411\uff0c\u4ec5\u4ec5\u8d1f\u8d23\u5728\u8fb9\u7f18\u65f6\u4eae\u7684feature<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>id = selectedRegionID;\n\nregionRampMask =\n    (id + 0.5 &gt;= 1.0) &amp;&amp;\n    (id - 0.5 &lt;= 4.0)\n        ? 1.0\n        : 0.0;\nprojectedX = normal.x * view.z - normal.z * view.x;\nprojectedY = normal.z * view.y - normal.y * view.z;\n\nrampUV = float2(projectedX, projectedY) * 0.5 + 0.5;\n\nrampSample = Normal_Flowmap_40001_2.SampleLevel(rampUV, rampLOD);\n\n\/\/ \u8fd9\u91cclerp\u7531\u4e8emask\u662f0\/1\uff0c\u5b9e\u9645\u5c31\u662f2\u90091\nrampRGB = lerp(\n    rampSample.rgb,\n    rampSample.a.xxx,\n    regionRampMask\n);\n\nrampColored = rampRGB * RampColor.rgb * rampIntensity;\nspecTerm += rampColored * regionSpecParams;<\/code><\/pre>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_Normal_Flowmap_40001_N.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/T_Normal_Flowmap_40001_N.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1826\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Normal_Flowmap_40001_N.rg<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLDR\uff1a<\/strong><code>Normal_Flowmap_40001_N.rg<\/code> \u5bf9\u5e94Parallax map\uff08\u89c6\u5dee\u8d34\u56fe\uff09\uff1b\u5f53\u524d\u4e3b\u8981\u5728 regionID = 3 \u7684\u533a\u57df\u4e2d\uff0c\u914d\u5408\u89c6\u89d2\u65b9\u5411\u4e0e height\/SDF \u641c\u7d22\uff0c\u7b97\u51fa\u4e00\u6bb5 UV \u504f\u79fb\uff0c\u7528\u6765\u63a8\u52a8\u540e\u7eed Cloth_D \/ Cloth_N \/ FTM \/ RGID \u7684\u91c7\u6837\uff0c\u4ee5\u4f53\u73b0\u51fa\u7279\u5b9a\u533a\u57df\u51f9\u51f8\u4e0d\u5e73\u7684\u7eb9\u7406\u7ec6\u8282<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u5c55\u5f00\uff1aNormal_Flowmap_40001_N.rg \u8be6\u7ec6\u903b\u8f91<\/strong><\/summary>\n<p class=\"wp-block-paragraph\">feature:\u8fd9\u662f <strong>Parallax Mapping<\/strong>\uff08\u89c6\u5dee\u8d34\u56fe\uff09 \u7684\u4e00\u79cd\u53d8\u4f53\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u771f\u5b9e\u51e0\u4f55\u91cc\uff0c\u5982\u679c\u5e03\u6599\u8868\u9762\u6709\u51f8\u8d77\u3001\u7ed2\u6bdb\u3001\u7eb9\u7406\u6c9f\u69fd\uff0c\u659c\u7740\u770b\u65f6\uff0c\u4f60\u770b\u5230\u7684\u5e76\u4e0d\u662f\u539f\u59cb UV \u90a3\u4e2a\u70b9\uff0c\u800c\u662f\u89c6\u7ebf\u7a7f\u8fc7\u8868\u9762\u9ad8\u5ea6\u573a\u540e\u78b0\u5230\u7684\u53e6\u4e00\u4e2a\u70b9\u3002\u5982\u4e0b\u56fe\uff0c\u6b64\u65f6\u91c7\u6837A\u5c31\u4e0d\u592a\u5bf9\uff0c\u5e94\u8be5\u91c7\u6837B\uff0c\u4e8e\u662f\u9700\u8981\u8ba1\u7b97\u51fauv offset<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-12-1024x640.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"640\" fetchpriority=\"low\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-12-1024x640.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1840\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u7279\u5b9a\u7684region id\uff0c\u91c7\u7528\u8fd9\u4e2aflow map \u76f4\u63a5\u5f71\u54cd\u4e3b uv \u8ba9\u7eb9\u7406\u504f\u79fb\u3002cloth\u4e0b\uff0cregion id = 3 \u89e6\u53d1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6cbf\u89c6\u89d2\u65b9\u5411\u505a\u591a\u6b65 raymarch\uff0c\u6bcf\u4e00\u6b65\u7528 flowmap.rg \u7ed9\u8fd9\u4e2a\u6b65\u8fdb\u4f4d\u7f6e\u4e00\u4e2a\u5c40\u90e8\u65b9\u5411\u6270\u52a8\uff0c\u518d\u7ed3\u5408\u9ad8\u5ea6\/\u906e\u7f69\u51b3\u5b9a\u6700\u7ec8 UV \u504f\u79fb\u3002\u8fd9\u4e2a\u9ad8\u5ea6\u5b9e\u9645\u662f T_Sparkle_SDF \u7684 r \u901a\u9053\uff0c\u4e3a\u4e86\u6a21\u62df\u5e03\u6599\uff0c\u5927\u6982\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-13.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"875\" height=\"875\" fetchpriority=\"low\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-13.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1844\"  sizes=\"(max-width: 875px) 100vw, 875px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>flowRegionMask = (regionID == 3) ? 1.0 : 0.0;\n\n\/\/ tangent space view slope\uff0c\u89c6\u89d2\u8d8a\u659c\uff0cUV \u504f\u79fb\u8d8a\u5927\nviewOffset.x = -dot(viewDir, tangent)   \/ dot(viewDir, normal);\nviewOffset.y = -dot(viewDir, bitangent) \/ dot(viewDir, normal);\n\nparallaxStrength = 0.005333 * flowRegionMask;\n\n\/\/ \u5148\u628a\u8d77\u70b9\u4ece baseUV \u5f80\u89c6\u89d2\u53cd\u65b9\u5411\u63a8\u4e00\u70b9\nuv0 = baseUV - viewOffset * parallaxStrength;\n\nif (flowRegionMask == 1)\n{\n    float uvScale = 30.0;\n    float stepCount = 8.0;\n    float layerStep = 1.0 \/ stepCount;\n\n    \/\/ \u5b9e\u9645\u5faa\u73af\u6b21\u6570\u662f stepCount + 2 = 10 \u6b65\n    int loopCount = 10;\n\n    float2 rayStepUV = viewOffset * 0.005333 \/ stepCount;\n\n    \/\/ \u6ce8\u610f\uff1aheight\/SDF \u91c7\u6837\u7528\u7684\u662f 30 \u500d tiled UV\n    float2 scaledBaseUV = uv0 * uvScale;\n\n    float currentLayer = 1.0;\n    float prevLayer = 1.0;\n    float prevHeight = 1.0;\n\n    float2 prevOffsetScaled = 0;\n    float2 finalOffsetScaled = 0;\n\n    \/\/ shader \u91cc\u8fd8\u6709\u4e00\u4e2a facing mask\uff0c\u5927\u81f4\u662f\u89c6\u89d2\/\u6cd5\u7ebf\u76f8\u5173\u7684 smoothstep\n    \/\/ \u4e0d\u671d\u5411\u5408\u9002\u65b9\u5411\u65f6\uff0cheight \u4f1a\u88ab\u538b\u4f4e\n    float heightMask = smoothstep01(saturate(NoVTerm)) * flowRegionMask;\n\n    for (int i = 0; i &lt; 10; i++)\n    {\n        \/\/ flowmap \u91c7\u6837\uff1a\u6cbf viewOffset \u65b9\u5411\u5f80\u524d\u8d70\n        float2 rayUV = uv0 + rayStepUV * (i + 1);\n\n        float2 flowVec =\n            T_Normal_Flowmap_40001_N.SampleGrad(sampler, rayUV, ddx, ddy).rg * 2.0 - 1.0;\n\n        \/\/ \u8fd9\u91cc 0.08 \/ 8 = 0.01\n        float2 flowOffsetScaled = flowVec * 0.01;\n\n        \/\/ height \/ SDF \u91c7\u6837\uff1a\u4e0d\u662f rayUV\uff0c\u800c\u662f scaledBaseUV + \u4e0a\u4e00\u6b65 offset\n        float2 heightUV = scaledBaseUV + prevOffsetScaled;\n\n        float height =\n            T_Sparkle_SDF.SampleGrad(sampler, heightUV, ddx, ddy).r\n          * heightMask;\n\n        \/\/ \u6838\u5fc3\u5224\u65ad\uff1a\n        \/\/ currentLayer \u4ece 1.0 \u5f00\u59cb\uff0c\u6bcf\u6b65\u51cf 1\/8\n        \/\/ height \u662f\u5f53\u524d SDF\/height \u7eb9\u7406\u7ed9\u51fa\u7684\u9ad8\u5ea6\n        \/\/ \u5982\u679c currentLayer &lt; height\uff0c\u8bf4\u660e ray \u5df2\u7ecf\u8fdb\u5165\/\u7a7f\u8fc7 heightfield\n        bool hit = currentLayer &lt; height;\n\n        if (hit)\n        {\n            float hitT =\n                (height - currentLayer)\n              \/ ((prevLayer - currentLayer) - prevHeight + height);\n\n            \/\/ \u547d\u4e2d\u540e\u5728\u4e0a\u4e00\u5c42\u548c\u5f53\u524d\u5c42\u4e4b\u95f4\u63d2\u503c\uff0c\u51cf\u5c11 8 \u6b65 raymarch \u7684\u9636\u68af\u611f\n            finalOffsetScaled =\n                prevOffsetScaled\n              - hitT * (rayStepUV * uvScale - flowOffsetScaled);\n\n            break;\n        }\n        else\n        {\n            \/\/ \u6ca1\u547d\u4e2d\u5c31\u7ee7\u7eed\u63a8\u8fdb\u3002\n            \/\/ \u6ce8\u610f\u5b83\u4e0d\u662f\u7b80\u5355 accumulated += flowOffset\uff1b\n            \/\/ shader \u4f1a\u628a ray \u6b65\u8fdb offset \u548c flowmap offset \u7ec4\u5408\u6210\u65b0\u7684\u5019\u9009 offset\u3002\n            finalOffsetScaled =\n                rayStepUV * uvScale * (i + 1)\n              + flowOffsetScaled * (10.0 - i);\n\n            prevOffsetScaled = finalOffsetScaled;\n            prevLayer = currentLayer;\n            prevHeight = height;\n\n            currentLayer -= layerStep;\n        }\n    }\n\n    finalUV = uv0 + finalOffsetScaled \/ uvScale;\n}\nelse\n{\n    finalUV = baseUV;\n}<\/code><\/pre>\n<\/details>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"695\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1828\"  sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">T_Wenli_230046<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><code>T_Wenli_230046<\/code> \u662f\u4e00\u5c42\u4f1a\u968f\u7269\u4f53\/\u5c4f\u5e55\u5750\u6807\u6eda\u52a8\u7684 second texture\uff0c\u5f53\u524d\u53c2\u6570\u8ba9\u5b83 <strong>\u6a2a\u5411\u91cd\u590d 4 \u6b21\u3001\u7eb5\u5411\u91cd\u590d 2 \u6b21\uff0c\u5e76\u6309\u65f6\u95f4\u7f13\u6162\u6eda\u52a8\uff0c\u7136\u540e\u67d3\u6210\u504f\u84dd\u7d2b\u7684\u989c\u8272<\/strong>\u3002\u4ee5\u4f53\u73b0\u7eb9\u7406\u5728\u6a21\u578b\u8868\u9762\u6d41\u52a8\u7684\u6548\u679c\u3002<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u5c55\u5f00\uff1aT_Wenli_230046 second texture \u8be6\u7ec6\u903b\u8f91<\/strong><\/summary>\n<p class=\"wp-block-paragraph\"><strong>1. \u5148\u6784\u9020 object-screen UV<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">object-screen UV \u7406\u89e3\uff1a\u5c4f\u5e55\u7a7a\u95f4\u5185\uff0c\u5f53\u524dpixel\u4e0ecenter\u7684\u8ddd\u79bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5f53\u524d\u50cf\u7d20\/\u5f53\u524d\u7247\u5143\u7684\u67d0\u4e2a view\/object relative \u4f4d\u7f6e\nfloat3 p = pixelRelativePos;        \/\/ \u5bf9\u5e94 _353,_354,_355\n\n\/\/ \u7269\u4f53\/\u89d2\u8272\u57fa\u51c6\u70b9\uff0c\u6765\u81ea cbuffer\nfloat3 center = objectCenterOrPivot; \/\/ \u5bf9\u5e94 cb2&#91;5].xyz \/ _1606,_1607,_1608\n\n\/\/ \u628a\u5f53\u524d\u70b9\u6295\u5f71\u5230\u5c4f\u5e55\nfloat2 screenP;\nscreenP.x = ProjectX(p);\nscreenP.y = -ProjectY(p);\n\n\/\/ \u628a\u7269\u4f53\u57fa\u51c6\u70b9\u6295\u5f71\u5230\u5c4f\u5e55\nfloat2 screenCenter;\nscreenCenter.x = ProjectX(center);\nscreenCenter.y = -ProjectY(center);\n\n\/\/ \u4e24\u8005\u76f8\u51cf\uff0c\u5f97\u5230 object screen uv\nfloat2 objectScreenUV = screenP - screenCenter;\n\n\/\/ \u7136\u540e shader \u4f1a\u6309\u8ddd\u79bb\/\u6df1\u5ea6\u505a\u4e00\u6b21\u7f29\u653e\uff1a\ndepthScale = abs(ProjectDepth(center + cameraPos) * 0.01);\nobjectScreenUV *= depthScale;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u5e26\u5165 <code>Second_ScreenObjectUV = float4(0,0,1,0.7<\/code>\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>objectScreenUV =\n    (Project(pixelPos) - Project(objectCenter))\n  * depthScale\n  * float2(1.0, 0.7)\n  + 0.5;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. \u518d\u5e26\u5165 Second_UV.xy = (4, 2)<\/strong>\uff08\u57fa\u7840\u7f29\u653e\uff09 \u548c <strong>Second_UV.<\/strong>zw \uff08\u6eda\u52a8\u901f\u5ea6\uff09<br><br>secondUV = objectScreenUV * float2(4.0, 2.0)<br>+ timePhase * float2(0.03, 0.02);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. \u91c7\u6837 T_Wenli_230046<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>secondSample = T_Wenli_230046.SampleBias(secondUV).rgb;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u524d second \u5904\u7406\u53c2\u6570\u91cc power \/ blend \u57fa\u672c\u4e0d\u4f1a\u6539\u53d8\u91c7\u6837\u989c\u8272\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>power = 1.0;\nintensityA = 1.0;\nintensityB = 1.0;\nblend = 0.0;\n\nsecondRGB \u2248 secondSample.rgb;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. \u5e26\u5165 Second_ColorTint = (1.2, 1.9, 4.0)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>secondTinted.rgb = secondRGB * float3(1.2, 1.9, 4.0);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u76f4\u89c2\u7406\u89e3\uff1a\u84dd\u901a\u9053\u88ab\u653e\u5927\u6700\u591a\uff0c\u6240\u4ee5\u8fd9\u5c42 <code>T_Wenli_230046<\/code> \u6700\u7ec8\u504f\u84dd\/\u9752\u7d2b\uff0c\u50cf\u4e00\u5c42\u989d\u5916\u53d1\u5149\u7eb9\u7406\u6216\u6d41\u52a8\u7eb9\u7406\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u540e\u5b83\u8fd8\u4f1a\u518d\u4e58 rim\/view mask\u3001\u5176\u5b83 second mask\uff0c\u7136\u540e\u52a0\u5230\u6700\u7ec8\u989c\u8272\u91cc\u3002\u7b80\u5316\u94fe\u8def\u5c31\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>objectScreenUV\n -&gt; * float2(4.0, 1.4)\n -&gt; + time * float2(0.03, 0.02)\n -&gt; sample T_Wenli_230046.rgb\n -&gt; * float3(1.2, 1.9, 4.0)\n -&gt; mask\/rim \u8c03\u5236\n -&gt; finalColor += secondContribution<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u7ec4\u53c2\u6570\u8ba9 <code>T_Wenli_230046<\/code> \u4f5c\u4e3a\u4e00\u5c42\u968f\u65f6\u95f4\u6eda\u52a8\u7684 second \u7eb9\u7406\u8986\u76d6\u5728\u5e03\u6599\u4e0a\uff0c\u6a2a\u5411\u5bc6\u5ea6\u66f4\u9ad8\uff0c\u989c\u8272\u88ab\u5f3a\u70c8\u63a8\u5411\u84dd\u8272\uff0c\u7528\u6765\u505a\u989d\u5916\u7eb9\u7406\/\u5149\u7eb9\u6548\u679c\u3002<\/p>\n<\/details>\n\n\n\n<div class=\"wp-block-group alignwide\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-19.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"788\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-19.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1856\"  sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FX.r<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-20.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"787\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-20.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1857\"  sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FX.g<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-21.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"788\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-21.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1858\"  sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FX.b<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-22.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"787\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-22.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1859\"  sizes=\"auto, (max-width: 789px) 100vw, 789px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">Cloth_FX.a<\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_FX \u662f effect mask \u6253\u5305\u8d34\u56fe\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728 event478 cloth shader \u4e2d\uff0c\u53ea\u6709 Cloth_FX.g \u88ab\u4f7f\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloth_FX.g\uff1a<br>\u63a7\u5236\u4e00\u6761 rim light \u7684mask\u3002<br>shader \u5bf9\u5b83\u505a pow(fxG, cb4[154].z)\uff0c\u518d\u4e58\u5230 effect\/rim \u989c\u8272\u4e0a\u3002<br>\u503c\u4e3a1\uff0c\u8be5\u533a\u57df\u8d8a\u5bb9\u6613\u51fa\u73b0\u989d\u5916\u4eae\u8fb9\u3001\u53d1\u5149\/\u7279\u6548\u8272\u54cd\u5e94\uff1b<br>\u503c\u4e3a0\uff0c\u5c4f\u853d\u8fd9\u4e2aeffect\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. RT1.b &#8211; Shadow<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLDR\uff1a<\/strong>RT1.b \u662f shadow\u3002\u5b83\u7684\u6765\u6e90\u94fe\u8def\u662f\uff1aRGID\/FTM.a \u9009 region \u2192 Cloth_D.a \u8ba1\u7b97 solid shadow mask \u4ee3\u8868\u6750\u8d28\u5c42\u7ea7\u7684\u660e\u6697\u7ec6\u8282  \u2192 NoL + \u57fa\u4e8eviewDir \u7684 bias + \u57fa\u4e8e\u6750\u8d28\u7684 shadowWidth\uff0c\u8ba1\u7b97 rt1RampCoord\uff0c\u5373\u5199\u5165 GBuffer \u524d\u7684\u573a\u666f\u5c42\u7ea7\u660e\u6697\u6807\u91cf \u2192 \u4e24\u9879\u4e58\u79ef\uff0c\u653e\u7f29\u5230 0.5 &#8211; 1\u7684 RT1.b\u3002<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u5c55\u5f00\uff1aRT1.b basepass \u6765\u6e90\u94fe\u8def<\/strong><\/summary>\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 1\uff1aregion id \u89e3\u7801\uff0c\u7528\u6765\u9009\u62e9 ramp \u53c2\u6570\u3002<\/strong>\u4f4e\/\u9ad8 4bit \u6765\u81ea <code>Texture2D0 \/ RGID<\/code> \u7684 R \u901a\u9053\uff0chigh\/low \u7684\u9009\u62e9\u6765\u81ea <code>Texture2D1 \/ Cloth_FTM.a<\/code>  \u5177\u4f53\u7684 id \u5206\u5e03\u53ef\u4ee5\u53c2\u8003 MSM_ToonCommon RGID \u8d34\u56fe\u7684\u62c6\u89e3\u3002regionID \u8303\u56f4 0  &#8211; 4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ RGID: Texture2D0.r, baseUV = _236\/_237\nfloat rgid = Texture2D0.SampleLevel(s0, baseUV, lod).r; \/\/ _2418.r\nint packed = (int)(rgid * 255.5);                       \/\/ _2421\nfloat low4  = float(packed &amp; 15);                       \/\/ _2424\nfloat high4 = float(packed &gt;&gt; 4);                       \/\/ _2423\n\n\/\/ FTM.a: Texture2D1.a, final\/parallax UV = _2575\/_2576\nfloat chooseHigh = Texture2D1.SampleLevel(s1, finalUV, lod).a &lt; 0.5 ? 0.0 : 1.0; \/\/ _2815\nfloat regionID = low4 + chooseHigh * (high4 - low4);                            \/\/ _2819<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 2\uff1a\u4ece Cloth_D.a \u901a\u9053\u5f97\u5230 solid shadow mask\u3002<\/strong>uv \u662f\u524d\u9762 parallax\/flow \u7d2f\u79ef\u540e\u7684\u6700\u7ec8\u91c7\u6837 UV\u3002shader \u7528\u5b83\u91c7\u6837 <strong>Cloth_D.a<\/strong>\uff0c\u518d\u6839\u636e\u9634\u5f71\u5bbd\u5ea6\u548c\u8303\u56f4\u8fdb\u884c\u7f8e\u672f\u6548\u679c\u88c1\u526a\uff0c\u5f97\u5230 <code>solidShadowMask<\/code>\u3002\u8fd9\u91cc\u7ed3\u679c\u662f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8f93\u5165\u8303\u56f4 0.035 -&gt; 0.315 \u88ab\u7ebf\u6027\u6620\u5c04\u5230 solidShadowMask 0 -&gt; 1<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ alphaInputMax\uff1a\u8f93\u5165 a \u7684\u6709\u6548\u4e0a\u9650\u3002\u4e5f\u5c31\u662f\u53ea\u8003\u86510 - 0.5\u90e8\u5206\u7684\u53d8\u5316\uff0c\u653e\u7f29\u4e0a\u754c\n\/\/ SolidShadowProcess\uff1a\u4e0ealphaInputMax\u4e58\u79ef\uff0c\u4e5f\u5c31\u662f\u53ea\u8003\u8651 0 - 0.35\u7684\u53d8\u5316\uff0c\u653e\u7f29\u4e0a\u754c\n\/\/ SolidShadowWidth\uff1a\u503c\u4e3a 0.8\uff0c\u653e\u7f29\u4e24\u8fb9\uff0c\u4ece0 - 0.35 \u5230 0.035 -&gt; 0.315\n\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1a\n\/\/ alphaInputMax = 0.5, SolidShadowProcess = 0.7, SolidShadowWidth = 0.8\n\/\/ low = 0.1, high = 0.9\n\/\/ Cloth_D.a \u8f93\u5165\u8303\u56f4 0.035 -&gt; 0.315 \u88ab\u7ebf\u6027\u6620\u5c04\u5230 solidShadowMask 0 -&gt; 1\u3002\n\/\/ \u7b49\u6548\u5f0f\uff1asolidShadowMask = saturate((Cloth_D.a - 0.035) \/ 0.28)\n\nfloat alphaOrHeight = Texture2D5.SampleBias(s5, finalUV, mipBias).a; \/\/ _2580\n\nfloat alphaInputMax = cb4&#91;1904].y \/* 0.5 *\/;\nfloat alphaClamp0 = min(max(alphaOrHeight, 0.0), alphaInputMax);            \/\/ _2583,_2584\nfloat alphaNorm0  = alphaClamp0 \/ alphaInputMax;                            \/\/ _2585\n\nfloat SolidShadowProcess = cb4&#91;1984].z \/* 0.7, MI: SolidShadowProcess *\/;\nfloat alphaNorm1 = min(alphaNorm0, SolidShadowProcess) \/ SolidShadowProcess; \/\/ _2588,_2590\n\nfloat SolidShadowWidth = cb4&#91;2000].w \/* 0.8, MI: SolidShadowWidth *\/;\nfloat solidShadowLow  = cb4&#91;2000].y \/* 0.1 = (1 - SolidShadowWidth) * 0.5 *\/;\nfloat solidShadowHigh = cb4&#91;2000].x \/* 0.9 = (1 + SolidShadowWidth) * 0.5 *\/;\nfloat alphaWindow = min(max(alphaNorm1, solidShadowLow), solidShadowHigh);   \/\/ _2594,_2595\n\nfloat solidShadowMask =\n    (alphaWindow - solidShadowLow) \/ SolidShadowWidth;                       \/\/ _2598<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 3\uff1alightDir \u53ca\u6df7\u5408\u3002<\/strong><strong>shadow<\/strong> \u8303\u56f4\u7684\u8ba1\u7b97\u9700\u8981NdotL\uff0c\u8fd9\u91cc\u7684L\u9700\u8981\u53ef\u80fd\u7684\u6df7\u5408\uff0c\u5f53\u7136\u5728cloth shader\u91cc\u9762\uff0c\u8fd9\u51e0\u90e8\u5206\u6df7\u5408\u90fd\u88ab\u5173\u6389\u4e86\uff0clightDir\u76f4\u63a5\u5c31\u662f\u573a\u666f\u4e3b\u5149\u65b9\u5411\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5f53\u524d\u6700\u7ec8\u7b49\u6548\uff1a\nfloat rampLight \u2248 (-0.5792279, -0.4055798, 0.70710677)\n\/\/ \u5373\uff1aRT1.b \u7684 ramp shadow \u65b9\u5411\u57fa\u672c\u4f7f\u7528\u4e00\u4e2a\u7a33\u5b9a\u7684 draw\/scene \u7ea7\u65b9\u5411\uff0c\u800c\u4e0d\u662f\u9010\u50cf\u7d20 normal map \u65b9\u5411\u3002\n\n\n\/\/ \u540e\u9762\u4e0d\u662f\u518d\u91cd\u5efa normal\uff0c\u800c\u662f\u628a rampLight \u7684\u5c4f\u5e55 XY \u671d\u5411\u4e0e viewDir.xy \u6bd4\u8f83\uff0c\u751f\u6210\u989d\u5916 ramp \u53ef\u89c1\u6027\u4fee\u6b63\u3002\n\/\/ \u5f53\u524d cb4&#91;2688].z = 0\uff0c\u6240\u4ee5 visibilityLoss = 0\uff0crampVisibility \u6052\u4e3a 1\u3002\nfloat facing2D = dot(normalize(rampLight.xy), normalize(float2(_361, _362))); \/\/ _2775\nfloat facingClamped = min(max(facing2D, -1.0), -0.25);                 \/\/ _2776,_2777\nfloat facing01 = (facingClamped + 1.0) * 1.33333;                      \/\/ _2778,_2779\n\nfloat oneMinusWidth = 1.0 - solidShadowMask;                           \/\/ _2780\nfloat visibilityLoss = (oneMinusWidth - facing01 * facing01 * oneMinusWidth) * cb4&#91;2688].z \/* 0 *\/; \/\/ _2781.._2786\nfloat rampVisibility = 1.0 - visibilityLoss;                           \/\/ _2787<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 4\uff1aregion \u9009\u62e9 shadow \u53c2\u6570\uff0c\u5e76\u8ba1\u7b97 shadow \u5750\u6807\u3002<\/strong><code>regionID<\/code> \u4f1a\u5728 <code>0\/1\/2\/3\/4_ShadowWidth<\/code> \u4e2d\u9009\u62e9\u4e00\u9879\uff1b\u8fd9\u91ccShadowWidthUseID\u4e3atrue\uff0c\u7528\u8fd9\u4e2a\u9009\u9879\uff0c\u5426\u5219\u7528\u5168\u5c40\u9879\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u7528 NoL\u3001region shadow width \u548c view bias \u5f52\u4e00\u5316\u51fa <code>shadowWindow01<\/code>\u3002\u5b83\u4e0d\u662f\u91c7\u6837 ramp \u8d34\u56fe\u7684 U\uff0c\u800c\u662f 0-1 \u7684\u660e\u6697\u7a97\u53e3\u5750\u6807\uff1b\u540e\u7eed\u5148\u505a smoothstep\uff0c\u518d\u4e58 <code>solidShadowMask<\/code>\uff0c\u5f97\u5230\u5171\u4eab\u4e2d\u95f4\u91cf <code>materialShadowWindow<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>materialShadowWindow<\/code> \u4e5f\u662f RT3.rgb secondary \u5f3a\u5ea6\u6df7\u5408\u91cc\u4f7f\u7528\u7684\u540c\u7c7b\u91cf\u3002\u533a\u522b\u662f\uff1aRT1.b \u628a\u5b83\u7f16\u7801\u5230 <code>0.5 - 1<\/code> \u5199\u5165 GBuffer\uff1bRT3.rgb \u4f7f\u7528\u672a\u7f16\u7801\u7684 <code>0 - 1<\/code> \u503c\u4f5c\u4e3a ramp intensity \u7684\u6df7\u5408\u56e0\u5b50\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u547d\u540d\u7edf\u4e00\uff1a\n\/\/ shadowWindow01\uff1aNoL\/width\/view bias \u5f52\u4e00\u5316\u540e\u7684 0-1 \u9634\u5f71\u7a97\u53e3\u5750\u6807\u3002\n\/\/ shadowWindowSmooth\uff1a\u5bf9 shadowWindow01 \u505a smoothstep \u540e\u7684\u5e73\u6ed1\u7a97\u53e3\u3002\n\/\/ materialShadowWindow\uff1ashadowWindowSmooth * solidShadowMask\uff0c\u662f RT1.b \u4e0e RT3.rgb \u5171\u7528\u7684\u6838\u5fc3\u9634\u5f71\u7a97\u53e3\u6982\u5ff5\u3002\n\/\/\n\/\/ \u7ed3\u8bba\uff1a\u8fd9\u548c RT3.rgb \u91cc\u7684 _1222 \u662f\u540c\u4e00\u4e2a\u516c\u5f0f\u6a21\u677f\uff0c\u4e0d\u662f\u4e24\u4e2a\u4e0d\u540c feature\u3002\n\/\/ \u5dee\u522b\u53ea\u5728\u4e8e\u8f93\u5165\u53d8\u91cf\u6765\u81ea\u4e0d\u540c\u4ee3\u7801\u6bb5\uff0cRT1.b \u6700\u540e\u628a\u7ed3\u679c\u7f16\u7801\u5230 0.5-1\u3002\n\/\/\n\/\/ \u5171\u4eab\u7b49\u6548\u51fd\u6570\uff1a\n\/\/ materialShadowWindow = ComputeMaterialShadowWindow(\n\/\/     halfNoL, shadowWidth, viewRampOffset, shadowProcess, solidShadowMask);\n\n\/\/ ShadowWidth\uff1awidth \u8d8a\u5c0f\uff0cshadowWindow01 \u5bf9 NdotL \u8d8a\u654f\u611f\uff0c\u660e\u6697\u8fb9\u754c\u8d8a\u786c\uff1bwidth \u8d8a\u5927\uff0c\u8fc7\u6e21\u8d8a\u8f6f\u3002\n\/\/ ShadowProcess\uff1a\u56fa\u5b9a\u628a shadowWindow01 \u5f80\u6697\u90e8\u538b\uff0c\u5f53\u524d\u4e3a 0.6\u3002\n\/\/ viewRampOffset\uff1a\u53ea\u5728\u8868\u9762 normal \u504f\u79bb\u89c6\u7ebf\u65f6\u751f\u6548\uff0c\u7528\u6765\u6309\u89c6\u89d2\u79fb\u52a8 ramp \u8fb9\u754c\u3002\n\/\/ \u5f53\u524d\u7b49\u6548\uff1ashadowWindow01 = saturate((halfNoL + rampWidth - viewRampOffset - ShadowProcess) \/ (2 * rampWidth))\nfloat rampWidth =\n    ((ShadowWidth * selectedRegionShadowWidth) - ShadowWidth) * ShadowWidthUseID\n  + ShadowWidth;                                                        \/\/ _2845\n\nfloat3 shadowNormal = normal; \/\/ normal map \u91c7\u6837\u540e\u7ecf TBN \u91cd\u5efa\uff1b\u5f53\u524d vertex normal \u6df7\u5408\u88ab\u5173\u6389\nfloat halfNoL = dot(shadowNormal, rampLight) * 0.5;                    \/\/ _2847\n\nfloat viewSideWeight = 1.0 - abs(viewDir.z);                           \/\/ \u6b63\/\u80cc\u89c6\u63a5\u8fd10\uff0c\u4fa7\u5411\u63a5\u8fd11\nfloat lightView01 = 0.5 * (viewSideWeight * dot(rampLight, viewDir) + 1.0);\nfloat viewSideRampOffset =\n    lightView01\n  * (cb4&#91;2032].x \/* 0.4, MI: SolidShadow_RampPosition *\/ - cb4&#91;2032].y \/* -0.1 *\/)\n  + cb4&#91;2032].y \/* -0.1 *\/;                                           \/\/ _2794.._2797\n\nfloat viewFacingMask = saturate(dot(shadowNormal, viewDir));\nfloat viewRampOffset = viewSideRampOffset * (1.0 - viewFacingMask);\n\nfloat shadowWindowRaw =\n    (0.5 - viewRampOffset - cb4&#91;2032].z \/* 0.6, MI: ShadowProcess *\/ + halfNoL + rampWidth)\n  \/ (2.0 * rampWidth);                                                \/\/ _2853\nfloat shadowWindow01 = saturate(shadowWindowRaw);                      \/\/ _2854\nfloat shadowWindowSmooth = shadowWindow01 * shadowWindow01 * (3.0 - 2.0 * shadowWindow01); \/\/ _2858.._2860\n\nfloat materialShadowWindow = shadowWindowSmooth * solidShadowMask;     \/\/ _2860 \u7684 0-1 \u672a\u7f16\u7801\u7248\u672c\nfloat RT1_b = (0.5 + materialShadowWindow * 0.5) * rampVisibility;      \/\/ _2862\nSV_Target1.z = RT1_b;<\/code><\/pre>\n<\/details>\n\n\n\n<h3 class=\"wp-block-heading\">4. RT2.rgb &#8211; Ramp<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLDR\uff1a<\/strong>RT2.rgb \u662f Ramp\u54cd\u5e94\u3002Ramp\u662fNPR\u7279\u6709\u7684\uff0c\u628a\u5149\u7167\u5f3a\u5ea6bake\u5230\u4e00\u5f20\u7279\u6b8a\u7684\u8d34\u56fe\u4e0a\u7684\uff0c\u4ee5\u51cf\u5c11\u5b9e\u9645\u8ba1\u7b97\u5149\u7167\u7684\u8ba1\u7b97\u91cf\u3002ramp\u8d34\u56fe\u6709\u4e94\u884c\uff0c\u6bcf\u884c\u5bf9\u5e94\u4e00\u79cd\u6750\u8d28\u4ece\u6700\u6697\u5230\u6700\u4eae\u7684\u53d8\u5316\uff1brampV\u6765\u81ea\u4e8eMI\u7684\u9884\u5148\u5b9a\u4e49\uff0ccloth\u4e2d\u7684rampV\u5747\u53d60.5\uff08\u7b2c\u4e09\u884c\uff09\uff1brampU\u6765\u81ea\u4e8e\u660e\u6697\u7a0b\u5ea6\uff0c\u7c7b\u4f3cRT1.b\uff0crampU\u4e5f\u4e3b\u8981\u57fa\u4e8eNoL\uff0c\u517c\u6709viewDir\u7684\u6270\u52a8\uff0c\u4ee5\u53caCloth_D.a\u901a\u9053\u7684\u6270\u52a8\u3002\u6700\u540e\u53d6\u51fa\u7684RGB\u4e0e\u4e00\u4e2abaseRGB\u6df7\u5408\u4e00\u4e0b\uff08\u6df7\u5408\u56e0\u5b50\u6839\u636eregion id\u6709\u6240\u4e0d\u540c\uff0c\u4e5f\u5b9a\u4e49\u5728MI\u4e2d\uff09\uff0c\u7136\u540esqrt\u540e\u5b58\u50a8\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u503c\u6700\u540e\u5728lighting\u5408\u6210\u65f6\u7684\u5229\u7528\u65b9\u5f0f\uff1a0.5*ramp*diffuse\uff0c\u76f4\u63a5\u52a0\u5230mainRGB\u4e0a\uff1bshadow\u63a7\u5236\u4e00\u4e2a\uff080.3\uff0c0.4\uff0c0.5\uff09*diffuse + 0.5*ramp*diffuse \u5230 diffuse \u7684\u63d2\u503c\u3002\u5f53\u5904\u4e8e\u6697\u90e8\uff0c\u53ef\u4ee5\u60f3\u5230ramp\u4f1a\u5f88\u4f4e\uff0c\u540c\u65f6\u63d2\u503c\u4f1a\u5f88\u63a5\u8fd10\uff0c\u5373\u63a5\u8fd1\u4e0b\u754c\uff0c\u56e0\u6b64\u5149\u7167\u53d8\u6697\u3002<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u5c55\u5f00\uff1aRT2.rgb basepass \u6765\u6e90\u94fe\u8def<\/strong><\/summary>\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 1\uff1a\u5f97\u5230 flow\/parallax \u540e\u7684\u91c7\u6837 UV \u4e0e region\u3002<\/strong>uv \u662f\u524d\u9762 parallax\/flow \u8ba1\u7b97\u540e\u7684 UV\uff1bshader \u7528\u8fd9\u4e2a UV \u91c7\u6837 FTM.a\uff0c\u5e76\u7ed3\u5408\u4e4b\u524d\u4ece <code>Texture2D0 \/ RGID<\/code> \u89e3\u51fa\u7684 high\/low 4bit\uff0c\u5f97\u5230 region id<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float2 flowUV = float2(_2060, _2061); \/\/ base UV + accumulated parallax\/flow offset\n\nfloat ftmB = Texture2D1.SampleLevel(s1, flowUV, lod).b; \/\/ _2063\nfloat ftmA = Texture2D1.SampleLevel(s1, flowUV, lod).a; \/\/ _2065, high\/low selector\n\nfloat regionID = low4 + step(0.5, ftmA) * (high4 - low4); \/\/ _2071<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 2\uff1aregion\/FTM.b \u751f\u6210\u4e00\u7ec4\u57fa\u7840\u54cd\u5e94\u8272\u3002<\/strong>\u4e8c\u8005\u5408\u5e76\u6210 <code>_2097<\/code>\uff0c\u7528\u4e8e\u5728\u4e24\u7ec4 cbuffer \u989c\u8272\u4e4b\u95f4\u63d2\u503c\uff0c\u8f93\u51fa <code>_2112\/_2113\/_2114<\/code>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ regionWindowMask\uff1a\u6309 regionID \u505a\u4e00\u4e2a\u7a97\u53e3\uff1b\u5f53\u524d\u9608\u503c\u4e3a 5\uff0c\u53ea\u4f1a\u547d\u4e2d regionID \u7b49\u4e8e 5 \u7684\u533a\u57df\uff0c\u56e0\u6b64\u5b9e\u9645\u4e3a 0\u3002\n\/\/ ftmResponse\uff1a\u7531 FTM.b \u751f\u6210\u7684\u989d\u5916\u6750\u8d28\u54cd\u5e94\uff1b\u5f53\u524d cb4&#91;1824].x = 0\uff0c\u4f7f FTM.b \u9879\u5b9e\u9645\u5173\u95ed\u3002\n\/\/ materialBlend\uff1a\u5728 colorB \u4e0e colorA \u4e4b\u95f4\u63d2\u503c\u30020 \u4f7f\u7528 colorB\uff0c1 \u4f7f\u7528 colorA\u3002\u5f53\u524d\u663e\u7136\u4e3a 0\n\/\/\n\/\/ \u7b49\u6548\u5f0f\uff1abaseResponseRGB = colorB = SubsurfaceColor.rgb = float3(0.36, 0.35, 0.5)\n\nfloat upper = regionID + 0.5; \/\/ _2076\nfloat lower = regionID - 0.5; \/\/ _2079\n\nfloat regionWindowMask =\n    (upper &gt;= cb4&#91;1744].x &amp;&amp; cb4&#91;1728].w &gt;= lower) ? 1.0 : 0.0; \/\/ _2077.._2082\n\nfloat ftmResponse =\n    saturate(cb4&#91;1824].y * 2.00803 * (cb4&#91;1824].x * (ftmB - 0.5) - 0.00199997)); \/\/ _2091\n\nfloat regionOrFtm = max(regionWindowMask, ftmResponse);                \/\/ _2092\nfloat materialBlend = cb4&#91;1856].y * (1.0 - regionOrFtm) + regionOrFtm; \/\/ _2097\n\nfloat3 colorA = cb4&#91;1584].rgb; \/\/ _2099.._2101\nfloat3 colorB = cb4&#91;1600].rgb \/* MI: SubsurfaceColor.rgb *\/; \/\/ _2103.._2105\nfloat3 baseResponseRGB = lerp(colorB, colorA, materialBlend); \/\/ _2112.._2114<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 3\uff1a\u6784\u9020 ramp \u56fe\u7684\u91c7\u6837\u5750\u6807\u3002<\/strong>\u8fd9\u91cc\u7684 <code>rampU<\/code> \u662f\u91c7\u6837 ramp \u8d34\u56fe\u7684 U\uff1b<code>rampV<\/code> \u5219\u662f 5 \u884c\u9009 1 \u884c\uff0c\u6839\u636e ramp id \u9009\u62e9 ramp \u6a2a\u5411\u5e26\u3002\u6ce8\u610f region id \u548c ramp id \u4e0d\u662f\u4e00\u4e00\u5bf9\u5e94\u7684\uff1aregion id \u7528\u6765\u5212\u5206\u533a\u57df\uff0cramp id \u5bf9\u5e94\u67d0\u533a\u57df\u7684\u6750\u8d28\u5c5e\u6027\u3002\u6bd4\u5982 cloth \u6750\u8d28\u6240\u6709 region \u7684 ramp id \u90fd\u662f 2\uff1bdown \u4e2d\u5168\u662f 1\uff1bup \u6709 0 \u6709 2\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ _2310\uff1a\u7531 dot(rampNormal, rampLight)\u3001ShadowProcess\u3001viewRampOffset \u7b97\u51fa\u7684 rampU \u4e0a\u7aef\u5019\u9009\u503c\uff0c\u8303\u56f4 0-1\u3002\n\/\/ cb4&#91;2640].w = SolidShadow_RampPosition = 0.4\uff1arampU \u7684\u7aef\u70b9\u4e0a\u9650\uff1b\n\/\/ _2314 = min(_2310, 0.4)\uff1a\u4e5f\u5c31\u662f rampU \u7684\u4f4e\u7aef\u7aef\u70b9\u3002\n\/\/ \u8fd9\u91cc\u4e0e RT1.b \u7684 solid shadow mask \u4f7f\u7528\u540c\u4e00\u7ec4 alpha remap \u53c2\u6570\u3002\n\/\/ alphaInputMax\/SolidShadowProcess\/SolidShadowWidth \u5171\u540c\u51b3\u5b9a Texture2D5.a \u7684\u54ea\u4e00\u6bb5\u4f1a\u88ab\u6620\u5c04\u5230 0-1\u3002\n\/\/ alphaRemap \u8d8a\u5927\uff0crampU \u8d8a\u9760\u8fd1 _2310\uff1balphaRemap \u8d8a\u5c0f\uff0crampU \u8d8a\u9760\u8fd1 _2314\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1aalphaRemap = saturate((Cloth_D.a - 0.035) \/ 0.28)\n\/\/ Cloth_D.a 0.035 -&gt; 0, 0.175 -&gt; 0.5, 0.315 -&gt; 1\n\/\/ \u7b49\u6548\u5f0f\uff1arampU = lerp(_2314, _2310, alphaRemap)\n\n\/\/ \u5148\u8ba1\u7b97 _2310\uff0c\u4e5f\u5c31\u662f rampU \u7684\u4e0a\u7aef\u5019\u9009\u503c\u3002\n\/\/ \u6ce8\u610f\u8fd9\u91cc\u6ca1\u6709\u9664\u4ee5 ShadowWidth\uff1b\u5b83\u662f\u7ed9 ramp \u56fe\u91c7\u6837\u7528\u7684 U\uff0c\u4e0d\u662f RT1.b \u7684 rt1RampCoord\u3002\nfloat3 N = float3(_2119, _2120, _2121);\nfloat3 L = float3(_2287, _2288, _2289);\nfloat3 viewDir = float3(_361, _362, _363);\n\nfloat halfNoL = dot(N, L) * 0.5; \/\/ _2290,_2291\n\nfloat viewSideWeight = _1169; \/\/ \u7ea6\u7b49\u4e8e 1 - abs(viewDir.z)\nfloat lightView01 = (viewSideWeight * dot(L, viewDir) + 1.0) * 0.5; \/\/ _2292.._2295\n\n\/\/ viewRampOffset \u7406\u8bba\u4e0a\u662f -0.1 \u5230 0.4\uff0c\u540c\u6837\u5f15\u5165\u4e86view\u5f71\u54cd\nfloat SolidShadow_RampPosition =  0.4;\nfloat rampPositionMin = cb4&#91;2032].y \/* -0.1 *\/;\nfloat viewSideRampOffset = lightView01 * (SolidShadow_RampPosition - rampPositionMin) + rampPositionMin; \/\/ _2299.._2301\n\nfloat viewFacingMask = saturate(dot(N, viewDir)); \/\/ _2302,_2303\nfloat viewRampOffset = viewSideRampOffset * (1.0 - viewFacingMask); \/\/ _2304,_2305\n\nfloat ShadowProcess = 0.6\uff1b\nfloat rampUHigh = saturate(halfNoL + 1.0 - ShadowProcess - viewRampOffset); \n\n\/\/ \u8fd9\u4e2a\u8303\u56f4\u7406\u8bba\u4e0a\u6b63\u597d\u662f 0 - 1\uff0c\u56e0\u4e3a viewRampOffset \u5c5e\u4e8e &#91;-0.1, 0.4]\nfloat rampUHigh = saturate(halfNoL + 0.4 - viewRampOffset); \n\n\/\/ \u8fd9\u4e00\u6bb5\u8ba1\u7b97\u903b\u8f91\u4e0eRT1.b\u5b8c\u5168\u76f8\u540c\n\/\/ Cloth_D.a \u8f93\u5165\u8303\u56f4 0.035 -&gt; 0.315 \u88ab\u7ebf\u6027\u6620\u5c04\u5230 solidShadowMask 0 -&gt; 1\u3002\n\/\/ \u7b49\u6548\u5f0f\uff1asolidShadowMask = saturate((Cloth_D.a - 0.035) \/ 0.28)\n\nfloat alphaOrHeight = Texture2D5.SampleBias(s5, flowUV, mipBias).a;    \/\/ _2318\nfloat alphaInputMax = cb4&#91;1904].y \/* 0.5\uff0c\u672a\u5728 MI \u4e2d\u627e\u5230\u552f\u4e00\u53c2\u6570\u540d *\/;\nfloat alphaClamp0 = min(max(alphaOrHeight, 0.0), alphaInputMax);        \/\/ _2321,_2322\nfloat alphaNorm0  = alphaClamp0 \/ alphaInputMax;                        \/\/ _2323\n\nfloat SolidShadowProcess = cb4&#91;1984].z \/* 0.7, MI: SolidShadowProcess *\/;\nfloat alphaNorm1 = min(alphaNorm0, SolidShadowProcess) \/ SolidShadowProcess; \/\/ _2326,_2328\n\nfloat SolidShadowWidth = cb4&#91;2000].w \/* 0.8, MI: SolidShadowWidth *\/;\nfloat solidShadowLow  = cb4&#91;2000].y \/* 0.1 *\/;\nfloat solidShadowHigh = cb4&#91;2000].x \/* 0.9 *\/;\nfloat alphaWindow = min(max(alphaNorm1, solidShadowLow), solidShadowHigh); \/\/ _2332,_2333\n\nfloat solidShadowMask  = (alphaWindow - solidShadowLow) \/ SolidShadowWidth;     \/\/ _2336\nfloat SolidShadow_RampPosition = cb4&#91;2640].w \/* 0.4, MI: SolidShadow_RampPosition *\/;\n\nfloat rampULow = min(max(rampUHigh, 0.0), SolidShadow_RampPosition); \/\/ _2314\n\n\/\/ \u5f53NoL\u90a3\u4e00\u9879\uff08rampUHigh\uff09\u5c0f\u4e8e0.4\uff0crampU\u5c31\u7b49\u4e8e\u8fd9\u4e00\u9879\uff1b\u5f53rampUHigh\u5927\u4e8e0.4\uff0c\u57280.4\u548c rampUHigh \u4e2d\u95f4\u63d2\u503c\n\/\/ \u4ece\u5b9e\u9645\u89c2\u5bdf\u4e0a\u6765\u770b\uff0cCloth_D.a\u5927\u90e8\u5206\u7684\u503c\u5927\u4e8e0.315\uff0c\u5373solidShadowMask\u5927\u90e8\u5206\u7b49\u4e8e1\uff0c\u5373rampU = rampUHigh\n\/\/ \u4ec5\u5728\u67d0\u4e9b\u7279\u6b8a\u7684\u5730\u65b9\uff0c\u5b58\u5728\u5c0f\u4e8e0.315\uff0c\u6b64\u65f6\u8868\u73b0\u51fa\u7684\u6548\u679c\u662f\u6b64\u533a\u57df\u5185\u7684\u5c40\u90e8\u53d8\u6697\uff0c\u7eaf\u9ed1\u7684\u90e8\u5206\u5b9a\u6b7b\u4e0a\u9650\u53d60.4\n\/\/ \u731c\u6d4b\u662f\u4e3a\u4e86\u4fdd\u8bc1\u67d0\u4e00\u5757\u533a\u57df\u7684\u5149\u7167\u4e0a\u9650\uff0c\u6bd4\u5982cloth\u7684\u6750\u8d28\u90e8\u5206\u4e0d\u5b9c\u8fc7\u4eae\nfloat rampU = rampULow + solidShadowMask * (rampUHigh - rampULow);            \/\/ _2337.._2339\n\n\/\/ V: regionID -&gt; one-hot -&gt; ramp row\nfloat r0 = max(regionID == 0.0 ? 1.0 : 0.0, ftmResponse);              \/\/ _2358\nfloat r1 = min(regionID == 1.0 ? 1.0 : 0.0, 1.0 - ftmResponse);        \/\/ _2359\nfloat r2 = min(regionID == 2.0 ? 1.0 : 0.0, 1.0 - ftmResponse);        \/\/ _2360\nfloat r3 = min(regionID == 3.0 ? 1.0 : 0.0, 1.0 - ftmResponse);        \/\/ _2361\nfloat r4 = min(regionID == 4.0 ? 1.0 : 0.0, 1.0 - ftmResponse);        \/\/ _2362\n\n\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ RampID \u51b3\u5b9a ramp \u56fe\u7684 V \u884c\u3002\u6bcf\u589e\u52a0 1\uff0crampV \u589e\u52a0 0.2\uff0c\u76f8\u5f53\u4e8e\u5207\u5230 ramp \u56fe\u7684\u53e6\u4e00\u6761\u6a2a\u5411\u5e26\u3002\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1a0\/1\/2\/3\/4_RampID \u5168\u90e8\u4e3a 2\n\/\/ \u7b49\u6548\u5f0f\uff1arampV = 2 * 0.2 + 0.1 = 0.5\n\/\/ \u6240\u4ee5\u5f53\u524d cloth \u7684 region 0-4 \u5728\u8fd9\u4e00\u6b65\u4e0d\u5207\u6362 ramp \u884c\uff0c\u90fd\u91c7\u6837 V=0.5 \u8fd9\u4e00\u884c\u3002\nfloat RampID0 = cb4&#91;2656].x \/* MI: 0_RampID = 2 *\/;\nfloat RampID1 = cb4&#91;2656].y \/* MI: 1_RampID = 2 *\/;\nfloat RampID2 = cb4&#91;2656].z \/* MI: 2_RampID = 2 *\/;\nfloat RampID3 = cb4&#91;2656].w \/* MI: 3_RampID = 2 *\/;\nfloat RampID4 = cb4&#91;2672].x \/* MI: 4_RampID = 2 *\/;\n\nfloat rampV =\n    (RampID0 * 0.2 + 0.1) * r0 +\n    (RampID1 * 0.2 + 0.1) * r1 +\n    (RampID2 * 0.2 + 0.1) * r2 +\n    (RampID3 * 0.2 + 0.1) * r3 +\n    (RampID4 * 0.2 + 0.1) * r4;                                      \/\/ _2367.._2375<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 4\uff1a\u91c7\u6837 Ramp \u56fe\uff0c\u5e76\u6df7\u5408\u56de\u57fa\u7840\u54cd\u5e94\u8272\u3002<\/strong><code>Texture2D10.rgb<\/code> \u662f\u8fd9\u6761\u94fe\u8def\u7684\u4e3b\u8981\u5f69\u8272\u91c7\u6837\u3002shader \u53c8\u7528 region \u6743\u91cd\u548c\u5168\u5c40 gate \u7b97\u51fa <code>_2394<\/code>\uff0c\u628a <code>baseResponseRGB<\/code> \u5f80 rampRGB \u62c9\u8fd1\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ baseResponseRGB = colorB = SubsurfaceColor.rgb = float3(0.36, 0.35, 0.5)\n\/\/ RampInt \u63a7\u5236 baseResponseRGB \u548c rampRGB \u7684\u63d2\u503c\u3002\n\/\/ RampInt\u8d8a\u9ad8\uff0c\u6700\u7ec8\u5c31\u8d8a\u63a5\u8fd1 rampRGB\uff0c\u53cd\u4e4b\u5c31\u662f\u8d8a base\n\/\/ globalGate \u662f\u5168\u5c40\u5f00\u5173\uff1b\u5f53\u524d cbuffer3&#91;16].w = 3\uff0c\u6240\u4ee5 globalGate = 1\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1aregion0=0.7, region1=0.5, region2=0.5, region3=0.1, region4=0.5\n\/\/ \u7b49\u6548\u5f0f\uff1amixedRGB = lerp(baseResponseRGB, rampRGB, selectedRampInt)\n\/\/ \u76f4\u89c2\u6548\u679c\uff1aregion3 \u6700\u5f31\uff0c\u53ea\u5411 rampRGB \u9760\u8fd1 10%\uff1bregion0 \u6700\u5f3a\uff0c\u9760\u8fd1 70%\u3002\nfloat3 rampRGB = Texture2D10.SampleBias(s10, float2(rampU, rampV), mipBias).rgb; \/\/ _2377.._2379\n\nfloat RampInt0 = cb4&#91;1648].x \/* MI: 0_RampInt = 0.7 *\/;\nfloat RampInt1 = cb4&#91;1648].y \/* MI: 1_RampInt = 0.5 *\/;\nfloat RampInt2 = cb4&#91;1648].z \/* MI: 2_RampInt = 0.5 *\/;\nfloat RampInt3 = cb4&#91;1648].w \/* MI: 3_RampInt = 0.1 *\/;\nfloat RampInt4 = cb4&#91;2688].y \/* MI: 4_RampInt = 0.5 *\/;\n\nfloat rampStrength =\n    RampInt0 * r0 + RampInt1 * r1 + RampInt2 * r2 + RampInt3 * r3 + RampInt4 * r4; \/\/ _2385.._2389\n\nfloat globalGate = cbuffer3&#91;16].w \/* 3.0 *\/ &lt; 0.05 ? 0.0 : 1.0; \/\/ _2393, \u5f53\u524d globalGate = 1\nfloat blendToRamp = globalGate * rampStrength; \/\/ _2394\n\nfloat3 mixedRGB = baseResponseRGB + blendToRamp * (rampRGB - baseResponseRGB); \/\/ _2401.._2403<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 5\uff1a\u53bb\u9971\u548c\/\u7070\u5ea6\u63d2\u503c\u540e\u5199\u5165 RT2.rgb\u3002<\/strong><code>cb4[2496].y<\/code> \u63a7\u5236\u5f69\u8272\u503c\u5411\u4eae\u5ea6\u7070\u5ea6\u9760\u62e2\u7684\u7a0b\u5ea6\u3002\u8fd9\u91cc\u4e3a0\uff0c\u6ca1\u6709\u8fd9\u4e2afeature\uff0c\u56e0\u6b64\u76f4\u63a5\u8f93\u51famixedRGB\u7684 <code>sqrt(saturate())<\/code> \u7f16\u7801\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float luma = dot(mixedRGB, float3(0.3, 0.59, 0.11)); \/\/ _2404\nfloat desatAmount = cb4&#91;2496].y \/* 0 *\/;                 \/\/ _2406\n\nfloat3 finalLinearRT2 = mixedRGB + desatAmount * (luma.xxx - mixedRGB); \/\/ _2413.._2415\n\nSV_Target2.x = sqrt(saturate(finalLinearRT2.r)); \/\/ _5067\nSV_Target2.y = sqrt(saturate(finalLinearRT2.g)); \/\/ _5068\nSV_Target2.z = sqrt(saturate(finalLinearRT2.b)); \/\/ _5069<\/code><\/pre>\n<\/details>\n\n\n\n<h3 class=\"wp-block-heading\">5. RT3.rgb &#8211; Diffuse<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLDR\uff1a<\/strong>RT3.rgb \u662f diffuse\u3002<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u5c55\u5f00\uff1aRT3.rgb basepass \u6765\u6e90\u94fe\u8def<\/strong><\/summary>\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 1\uff1aCloth_D.rgb \u91c7\u6837 base diffuse\u3002<\/strong><code>Texture2D5.SampleBias(...).rgb<\/code> \u662f\u4e3b\u57fa\u7840\u8272\u3002\u540e\u9762\u7684 <code>Damage_Skin_ColorTint<\/code>\u3001<code>Damage_Dirty_ColorTint<\/code>\u3001region window\u3001FTM.b mask \u548c\u51e0\u7ec4 RGB cbuffer \u4f1a\u5c1d\u8bd5\u628a\u5b83\u67d3\u8272\/\u538b\u6697\/\u6062\u590d\u5230\u767d\u8272\u3002\u5f53\u524d cloth \u53c2\u6570\u4e0b\u8fd9\u4e9b\u6548\u679c\u57fa\u672c\u5173\u95ed\uff0c\u6240\u4ee5\u8fd9\u4e00\u6bb5\u7b49\u6548\u4e3a <code>baseDiffuse0 = Cloth_D.rgb<\/code>\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ Cloth_D.rgb\uff1a\u4e3b albedo\/base color\u3002\n\/\/ damageSkinMask\uff1a\u7531 Cloth_FTM.b \u548c cb4&#91;1824] \u751f\u6210\u7684 skin\/damage \u67d3\u8272\u5f3a\u5ea6\u3002\u5f53\u524d cb4&#91;1824].x = 0\uff0c\u6240\u4ee5\u6052\u4e3a 0\u3002\n\/\/ regionWindowMask\uff1a\u53ea\u547d\u4e2d regionID \u7ea6\u7b49\u4e8e 5 \u7684\u7a97\u53e3\uff1b\u5f53\u524d cloth regionID \u4e3a 0-4\uff0c\u6240\u4ee5\u6052\u4e3a 0\u3002\n\/\/ materialMaskRGB\uff1a\u989d\u5916 RGB \u4e58\u6cd5 mask\u3002\u5f53\u524d\u4f1a\u88ab whiteBlend \u62c9\u56de 1\uff0c\u56e0\u6b64\u4e0d\u6539\u53d8\u989c\u8272\u3002\n\/\/ cb4&#91;272].rgb\uff1a\u5168\u5c40\/base RGB tint\uff0c\u5f53\u524d\u4e3a float3(1,1,1)\u3002\n\/\/\n\/\/ \u5f53\u524d\u7b49\u6548\uff1abaseDiffuse0 = Cloth_D.rgb\n\nfloat2 baseMaterialUV = float2(_555, _556);\nfloat4 clothD = Texture2D5.SampleBias(s5, baseMaterialUV, mipBias); \/\/ _718, line 631\nfloat3 clothDRGB = clothD.rgb;                                      \/\/ _719.._721\n\n\/\/ 1. skin\/damage tint mask\uff0c\u5f53\u524d\u5173\u95ed\nfloat ftmB = Texture2D1.SampleLevel(s1, baseMaterialUV, lod).b; \/\/ _590, Cloth_FTM.b\nfloat damageMaskScale = cb4&#91;1824].x \/* 0.0 *\/;\nfloat damageMaskIntensity = cb4&#91;1824].y \/* 1.0 *\/;\nfloat damageSkinMask = saturate(damageMaskIntensity * 2.00803 * (damageMaskScale * (ftmB - 0.5) - 0.00199997)); \/\/ _600 = 0\n\nfloat3 skinTint = cb4&#91;256].rgb \/* MI: Damage_Skin_ColorTint.rgb = float3(0.1, 0.08, 0.06) *\/; \/\/ _724.._726\nfloat3 tintedD = lerp(clothDRGB, skinTint, damageSkinMask); \/\/ _733.._735, \u5f53\u524d tintedD = clothDRGB\n\n\/\/ 2. region\/material window\u3002\u5f53\u524d\u53ea\u4f1a\u547d\u4e2d regionID=5\uff1bcloth \u7684 regionID \u662f 0-4\uff0c\u6240\u4ee5 regionWindowMask = 0\u3002\nfloat regionID = _632;\nfloat regionWindowMask = ((regionID + 0.5) &gt;= cb4&#91;1744].x \/* 5.0 *\/ &amp;&amp; cb4&#91;1728].w \/* 5.0 *\/ &gt;= (regionID - 0.5)) ? 1.0 : 0.0; \/\/ _661\nfloat damageOrRegionMask = max(regionWindowMask, damageSkinMask); \/\/ _667, \u5f53\u524d 0\n\n\/\/ 3. RGB \u901a\u9053\u7f29\u653e\u9879\uff1a\u5728 1 \u548c cb4&#91;144].rgb \u4e4b\u95f4\u63d2\u503c\u3002\u5f53\u524d cb4&#91;144].rgb = 1\uff0c\u6240\u4ee5 channelScaleRGB = 1\u3002\nfloat channelScaleBlend = lerp(cb4&#91;1856].y \/* 0.0 *\/, 1.0, damageOrRegionMask); \/\/ _671\nfloat3 channelScaleRGB = 1.0 + channelScaleBlend * (cb4&#91;144].rgb \/* float3(1,1,1) *\/ - 1.0); \/\/ _682.._684\n\n\/\/ 4. \u989c\u8272 mask\uff1a\u5148\u5728\u4e24\u7ec4 RGB \u4e4b\u95f4\u63d2\u503c\uff0c\u518d\u6309 FTM.b\/\u53c2\u6570\u62c9\u56de\u767d\u8272\u3002\u5f53\u524d whiteBlend = 1\uff0c\u6240\u4ee5 colorMaskRGB = 1\u3002\nfloat3 maskColorA = cb4&#91;224].rgb \/* MI: Damage_Dirty_ColorTint.rgb = float3(0.1, 0.08, 0.089) *\/;\nfloat3 maskColorB = cb4&#91;208].rgb \/* float3(0.848958, 0.587674, 0.543864)\uff0c\u672a\u627e\u5230\u552f\u4e00 MI \u540d *\/;\nfloat3 dirtyMaskRGB = lerp(maskColorA, maskColorB, damageOrRegionMask); \/\/ _699.._701\n\nfloat ftmBRemap = damageMaskScale * (ftmB - 0.5) + 0.5; \/\/ _595, \u5f53\u524d 0.5\nfloat whiteBlend = saturate(1.0 - cb4&#91;1856].z \/* 1.5 *\/ * (1.0 - saturate(ftmBRemap * 2.0))); \/\/ _708, \u5f53\u524d 1\nfloat3 colorMaskRGB = lerp(dirtyMaskRGB, float3(1,1,1), whiteBlend); \/\/ _715.._717, \u5f53\u524d 1\n\nfloat3 materialMaskRGB = colorMaskRGB * channelScaleRGB; \/\/ _740,_743,_746, \u5f53\u524d 1\nfloat3 baseTintRGB = cb4&#91;272].rgb \/* float3(1,1,1) *\/;\nfloat3 baseDiffuse0 = materialMaskRGB * baseTintRGB * tintedD; \/\/ _742,_745,_748, \u5f53\u524d = Cloth_D.rgb<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 2\uff1a\u6839\u636e Cloth_D.a\/region mask \u5bf9 base diffuse \u505a\u5c40\u90e8\u4fee\u6b63\u3002<\/strong><code>clothD.a<\/code> \u751f\u6210\u4e00\u7ec4\u4ee5 0.5 \u4e3a\u4e2d\u5fc3\u7684 remap \u5750\u6807\u3002\u5f53\u524d skin\/damage mask <code>_600=0<\/code>\uff0c\u4f46 region0 \u7684\u7a97\u53e3 <code>_651<\/code> \u4ecd\u53ef\u80fd\u751f\u6548\uff0c\u6240\u4ee5\u8fd9\u4e00\u6b65\u53ea\u5bf9 regionID=0 \u7684\u533a\u57df\u542f\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u4ec0\u4e48\u662fregionID = 0\uff1a\u56e0\u4e3a\u4eceRim light feature\u53ef\u4ee5\u770b\u51fa\uff0cregionID = 0\uff0c\u5176\u4e0d\u627f\u8f7drim light feature\uff0c\u800c\u662f\u91c7\u6837\u4e86\u4e00\u4e2a\u5f69\u8272\u8d34\u56fe\uff0c\u4f53\u73b0\u989c\u8272\u7ec6\u8282\u3002\u56e0\u6b64\u8fd9\u91cc\u7279\u6b8a\u5904\u7406\u3002\u9636\u6bb53\u4e5f\u662f\u5bf9\u8fd9\u91cc\u7279\u6b8a\u5904\u7406\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ _600\uff1askin\/damage \u67d3\u8272 mask\uff0c\u5f53\u524d cb4&#91;1824].x = 0\uff0c\u6240\u4ee5 _600 = 0\u3002\n\/\/ _651\uff1aregion0 \u5c40\u90e8\u4fee\u6b63\u7a97\u53e3\uff0c\u5f53\u524d\u7531 cb4&#91;1840].x = 0\u3001cb4&#91;1824].w = 0 \u5f62\u6210 regionID == 0 \u7684 mask\u3002\n\/\/ remappedDiffuse\uff1a\u56f4\u7ed5 0.5 \u505a overlay-like \u7684\u660e\u6697\u91cd\u6620\u5c04\uff0cremapCenter \u6765\u81ea Cloth_D.a \u7684 alpha remap \u94fe\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1a\n\/\/ _600 = 0\n\/\/ _651 = region0Mask = (regionID == 0 ? 1 : 0)\n\/\/ strength = min(_651, 1 - _600) = region0Mask\n\/\/\n\/\/ \u7b49\u6548\u5f0f\uff1abaseDiffuse1 = (regionID == 0) ? remappedDiffuse : baseDiffuse0\n\/\/ \u6240\u4ee5\u8fd9\u4e00\u6bb5\u4e0d\u662f\u5168\u5c40\u5173\u95ed\uff0c\u800c\u662f\u53ea\u5bf9 region 0 \u505a\u5c40\u90e8 diffuse \u66f2\u7ebf\u4fee\u6b63\u3002\n\n\/\/ _831\/_832\/_833 \u662f\u4ee5 0.5 \u4e3a\u4e2d\u5fc3\u7684 remap \u5750\u6807\uff0c\u6765\u6e90\u4e8e cb4&#91;1904]\/&#91;1984]\/&#91;2000] \u4e0e Cloth_D.a\nfloat3 remapCenter = float3(_831, _832, _833);\n\nfloat3 highShape = baseDiffuse0 * 2.0 * remapCenter;                         \/\/ _835,_837,_839\nfloat3 lowShape  = 1.0 - (1.0 - baseDiffuse0) * 2.0 * (1.0 - remapCenter);   \/\/ _852,_853,_854\n\nfloat3 remappedDiffuse = float3(\n    remapCenter.r &lt; 0.5 ? highShape.r : lowShape.r,\n    remapCenter.g &lt; 0.5 ? highShape.g : lowShape.g,\n    remapCenter.b &lt; 0.5 ? highShape.b : lowShape.b);                         \/\/ _870,_872,_874 as delta basis\n\nfloat strength = min(_651, 1.0 - _600);                                      \/\/ _868\nfloat3 baseDiffuse1 = baseDiffuse0 + (remappedDiffuse - baseDiffuse0) * strength; \/\/ _878,_879,_880<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 3\uff1a\u91c7\u6837 roughness metallic Shadow \u9879\uff0c\u751f\u6210\u989c\u8272\u4fee\u6b63\u3002<\/strong><code>Texture2D6 \/ Normal_Flowmap_40001_2<\/code> \u5728 rampUV \u4e0a\u91c7\u6837\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ Texture2D6\uff1a<span style=\"background-color: initial; font-family: inherit; font-size: inherit; text-align: initial; color: initial;\">Normal_Flowmap_40001_2<\/span>\uff1arim light feature \u67e5\u627e\u56fe\u3002\n\/\/ rampUV\uff1a<strong>\u6cd5\u7ebf\u6b63\u5bf9\u955c\u5934\u7684\u7a0b\u5ea6<\/strong>\n\/\/ projectedX = normal.x * view.z - normal.z * view.x;\n\/\/ projectedY = normal.z * view.y - normal.y * view.z;\n\/\/ rampUV = float2(projectedX, projectedY) * 0.5 + 0.5;\n\/\/\n\/\/ metallic = _1231\uff1a\u7531 region metallic base + Cloth_FTM.g \u5f97\u5230\u7684 0-1 \u6750\u8d28\u54cd\u5e94\u6743\u91cd\u3002\n\/\/ materialShadowWindow = _1222\uff1a\u4e0e RT1.b \u7684 materialShadowWindow \u662f\u540c\u4e00\u4e2a\u516c\u5f0f\u6a21\u677f\u3002\n\/\/ roughness = _1237\uff1a\u7531 region roughness base + Cloth_N.a \u5f97\u5230\uff1b\u540e\u9762 highMask \u5c31\u4ece\u5b83\u7684 0.9-1.0 \u9ad8\u6bb5\u5207\u51fa\u6765\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1a\n\/\/ metallicResponseRaw = regionMetallicBase + Cloth_FTM.g\u3002\n\/\/ roughness = regionRoughnessBase + Cloth_N.a\u3002\n\/\/ solidShadowMask = saturate((Cloth_D.a - 0.035) \/ 0.28)\u3002\n\/\/ cb4&#91;2176] = float4(6, 5, 1, 4)\uff0c\u7528\u4e8e rampLOD \u548c rampIntensity\u3002\n\/\/ cb4&#91;464].rgb = cb4&#91;480].rgb = cb4&#91;496].rgb = float3(1,1,1)\uff0c\u989c\u8272 tint \u9879\u5f53\u524d\u7b49\u6548\u4e3a 1\u3002\n\/\/ cb4&#91;2192].x = 1\uff0cramp\/secondary \u5168\u5c40\u5f3a\u5ea6\u6ca1\u6709\u5173\u95ed\u3002\n\/\/\n\/\/ \u7b49\u6548\u5f0f\uff1a\n\/\/ metallic = saturate((regionMetallicBase + Cloth_FTM.g) * 1.11111)\n\/\/ \u8fd9\u4e00\u6bb5\u4e0eRT1.b\u4e2d\u90a3\u90e8\u5206\u540c\u8d28\n\/\/ materialShadowWindow = ComputeMaterialShadowWindow(...) = shadowWindowSmooth * solidShadowMask\n\/\/ roughness = regionRoughnessBase + Cloth_N.a\n\/\/ highMask = saturate((roughness - 0.9) \/ 0.1)\n\/\/ rampMixed = (regionID == 0) ? ramp.rgb : ramp.a.xxx\n\/\/ rampIntensity = lerp(lerp(1, 5, metallic), lerp(1, 4, metallic), materialShadowWindow)\n\n\/\/ ---- \u4e0a\u6e38\u8f93\u5165\u95ed\u5305 ----\nfloat regionMetallicBase = _978; \/\/ region metallic base\uff1b\u5f53\u524d region0=-0.2, region1=-0.1, region2=-0.1, region3=0, region4=0\nfloat clothFTM_g = _374;         \/\/ Texture2D1 \/ Cloth_FTM.g\nfloat metallicResponseRaw = (regionMetallicBase + clothFTM_g - cb4&#91;1968].z \/* 0 *\/ * clothFTM_g) * cb4&#91;1968].w \/* 1 *\/; \/\/ _985\nfloat metallic = saturate(metallicResponseRaw * 1.11111); \/\/ _1231\n\nfloat clothD_a = _722; \/\/ Texture2D5 \/ Cloth_D.a\nfloat solidShadowMask = saturate((clothD_a - 0.035) \/ 0.28); \/\/ _998\uff0c\u6765\u81ea Stage 2 \u7684 Cloth_D.a remap\nfloat rampNormalLight = dot(float3(_759, _760, _761), float3(_1164, _1165, _1166)); \/\/ _1209\uff0cramp normal \u4e0e ramp light\/dir\nfloat regionRampWidth = _1208; \/\/ region \u9009\u62e9\u540e\u7684 ramp \u5bbd\u5ea6\/\u5f3a\u5ea6\uff0c\u6765\u81ea cb4&#91;2048]\/cb4&#91;2064]\nfloat regionRampOffset = _1182; \/\/ region \u9009\u62e9\u540e\u7684 ramp \u504f\u79fb\u9879\nfloat viewLoss = _1181; \/\/ view\/ramp \u4fa7\u5411\u9879\u5bfc\u81f4\u7684\u6263\u51cf\nfloat shadowWindow01 = saturate(((0.5 - regionRampOffset - viewLoss) + rampNormalLight * 0.5 + regionRampWidth) \/ (regionRampWidth * 2.0)); \/\/ _1217\nfloat shadowWindowSmooth = shadowWindow01 * shadowWindow01 * (3.0 - 2.0 * shadowWindow01);\nfloat materialShadowWindow = shadowWindowSmooth * solidShadowMask; \/\/ _1222\n\nfloat regionRoughnessBase = _979; \/\/ region roughness base\uff1b\u5f53\u524d region0=0.2, region1=0, region2=0, region3=0, region4=0\nfloat clothN_a = _562;            \/\/ Texture2D4 \/ Cloth_N.a\nfloat roughness = (regionRoughnessBase + clothN_a - cb4&#91;2064].z \/* 0 *\/ * clothN_a) * cb4&#91;2064].w \/* 1 *\/; \/\/ _1237\nfloat highMask = saturate((roughness - 0.9) \/ 0.1); \/\/ _1826.._1829\uff0cStage 4 \u4f7f\u7528\n\nfloat directionalLobeResponse = _1379; \/\/ \u524d\u9762\u7531 ramp\/view\/normal\u3001roughness \u4e0e materialShadowWindow \u7b97\u51fa\u7684\u65b9\u5411\u6027 lobe \u54cd\u5e94\n\n\/\/ ---- ramp lookup UV\uff1a\u4e0d\u662f baseUV\uff0c\u800c\u662f\u65b9\u5411 lookup UV ----\nfloat3 rampLookupDir = normalize(float3(_1386, _1390, _1394)); \/\/ _1397,_1398,_1399\nfloat3 rampLookupBasis = float3(_1412, _1415, _1418);\nfloat2 rampUV = 0.5 + 0.5 * float2(\n    rampLookupBasis.x * rampLookupDir.z - rampLookupBasis.z * rampLookupDir.x,\n    rampLookupBasis.z * rampLookupDir.y - rampLookupBasis.y * rampLookupDir.z); \/\/ _1427,_1428\n\nfloat rampLOD = cb4&#91;2176].x \/* 6.0 *\/ - 2.0 + log2(max(_1240, 0.001)) * 1.2 + mipBias; \/\/ _1436\nfloat4 ramp = Texture2D6.SampleLevel(s6, rampUV, rampLOD); \/\/ _1437\n\nfloat region1To4Mask = _1442; \/\/ min(_666, 1 - _600)\uff0c\u5f53\u524d\u7b49\u6548\u4e3a regionID 1-4 mask\nfloat3 rampMixed = lerp(ramp.rgb, ramp.a.xxx, region1To4Mask); \/\/ _1449.._1451\n\nfloat rampIntensityLow  = lerp(NonMetallicMatCapInt \/* 1 *\/, MetalMatCapBack \/* 5 *\/, metallic);\nfloat rampIntensityHigh = lerp(NonMetallicMatCapInt \/* 1 *\/, MetalMatCapInt \/* 4 *\/, metallic);\nfloat rampIntensity = lerp(rampIntensityLow, rampIntensityHigh, materialShadowWindow); \/\/ _1465\nfloat3 rampTinted = rampMixed * rampIntensity; \/\/ cb4&#91;464].rgb \u5f53\u524d\u4e3a float3(1,1,1)\n\n\/\/ ---- material lighting \u4fee\u6b63\u9879 ----\n\/\/ metallic \u5e76\u6ca1\u6709\u53ea\u51fa\u73b0\u5728\u6700\u7ec8\u51cf\u6cd5\u4e2d\uff1a\u5b83\u8fd8\u4f1a\u8fdb\u5165 materialCurveColor\u3001rampIntensity \u548c rampSpecMultiplier\u3002\n\/\/ \u56e0\u6b64\u4e0b\u9762\u4e09\u9879\u5408\u8d77\u6765\u662f\u6750\u8d28\u5149\u7167\u4fee\u6b63\uff0c\u4e0d\u5e94\u7406\u89e3\u4e3a\u5355\u7eaf\u7684 diffuse correction \u6216 metallic correction\u3002\nfloat curveBase = metallic * 0.04 + 0.04; \/\/ _1490\nfloat3 materialCurveColor = lerp(curveBase.xxx, baseDiffuse1, metallic); \/\/ _1497.._1499\n\n\/\/ metallic=0 -&gt; float3(1,1,1)\uff1bmetallic=1 -&gt; rampTinted * baseDiffuse1\u3002\nfloat3 rampSpecMultiplier = lerp(float3(1.0, 1.0, 1.0), rampTinted * materialCurveColor, metallic); \/\/ _1537.._1539\n\nfloat3 directionalSpec =\n    directionalLobeResponse\n  * materialCurveColor\n  * cb4&#91;2192].x \/* 1 *\/\n  * cb4&#91;496].rgb \/* float3(1,1,1) *\/\n  * rampSpecMultiplier; \/\/ _1543,_1547,_1551\n\nfloat roughnessClamped = min(max(roughness, 0.0), 0.9); \/\/ _1239\nfloat roughness01 = roughnessClamped * 1.11111; \/\/ _1240\nfloat invRough = 1.0 - roughness01; \/\/ _1506\nfloat viewFacing = _762;      \/\/ dot(blendedNormalOrPositionDir, viewDir)\uff0c\u6b63\/\u4fa7\u89c6\u76f8\u5173\u54cd\u5e94\nfloat rampShapeMask = _1382;   \/\/ \u6765\u81ea\u524d\u9762 ramp lookup\/basis \u6df7\u5408\u7684\u5f62\u72b6\u6743\u91cd\nfloat sideEnergy = min(invRough * invRough, exp2(((viewFacing - 1.0) * rampShapeMask + 1.0) * -9.28)) * invRough; \/\/ _1511.._1514\nfloat curveDark = 1.04000 - ((0.0425 - roughnessClamped * 0.0305556) + sideEnergy) * 1.04000; \/\/ _1517\nfloat curveLift = (roughnessClamped * 0.0244444 - 0.04000) + ((0.0425 - roughnessClamped * 0.0305556) + sideEnergy) * 1.04000; \/\/ _1518\nfloat liftMask = saturate(materialCurveColor.g * 50.0); \/\/ _1520\nfloat3 detailCurve = curveDark * materialCurveColor + curveLift * liftMask; \/\/ _1525.._1527\nfloat3 rampSpec =\n    cb4&#91;480].rgb \/* float3(1,1,1) *\/\n  * cb4&#91;2192].x \/* 1 *\/\n  * rampTinted\n  * detailCurve; \/\/ _1554,_1557,_1560\n\n\/\/ \u91d1\u5c5e\u5ea6\u589e\u5927\u65f6\u4ece\u4e3b\u4f53 diffuse \u4e2d\u6263\u9664\u76f8\u5e94\u80fd\u91cf\uff1ametallic=0 \u4e0d\u6263\uff0cmetallic=1 \u6263\u9664\u6574\u4efd baseDiffuse1\u3002\nfloat3 metallicDiffuseLoss =\n    baseDiffuse1\n  * metallic\n  * cb4&#91;2192].x \/* 1 *\/; \/\/ _1561.._1563<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 4\uff1aroughness mask \u63a7\u5236\u6750\u8d28\u5149\u7167\u4fee\u6b63\u3002<\/strong><code>materialLightingCorrection<\/code> \u7531\u65b9\u5411\u6027\u9ad8\u5149\u3001ramp \u9ad8\u5149\u548c metallic diffuse \u6263\u9664\u4e09\u9879\u7ec4\u6210\u3002metallic \u65e2\u76f4\u63a5\u51b3\u5b9a diffuse \u6263\u9664\uff0c\u4e5f\u5df2\u7ecf\u8fdb\u5165\u524d\u4e24\u9879\u7684\u989c\u8272\u4e0e\u5f3a\u5ea6\u8ba1\u7b97\uff1b<code>highRoughnessMask<\/code> \u53ea\u8d1f\u8d23\u5728 roughness \u7684 <code>0.9-1.0<\/code> \u9ad8\u6bb5\u9010\u6e10\u5173\u95ed\u6574\u7ec4\u4fee\u6b63\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ materialLightingCorrection \u4e0d\u662f\u5355\u72ec\u7684 metallic \u4fee\u6b63\uff0c\u4e5f\u4e0d\u662f\u666e\u901a diffuse \u4fee\u6b63\uff1a\n\/\/   directionalSpec     = \u65b9\u5411\u6027 lobe\/ramp \u9ad8\u5149\u54cd\u5e94\uff1bmetallic \u901a\u8fc7 materialCurveColor \u548c rampSpecMultiplier \u53c2\u4e0e\u3002\n\/\/   rampSpec            = ramp \u8d34\u56fe\u4ea7\u751f\u7684 secondary\/specular \u54cd\u5e94\uff1bmetallic \u901a\u8fc7 rampIntensity \u548c materialCurveColor \u53c2\u4e0e\u3002\n\/\/   metallicDiffuseLoss = metallic * baseDiffuse1\uff1b\u7528\u4e8e\u5728\u91d1\u5c5e\u5ea6\u5347\u9ad8\u65f6\u6263\u9664 diffuse \u80fd\u91cf\u3002\n\/\/\n\/\/ highRoughnessMask \u53ea\u53d6 roughness \u7684 0.9-1.0 \u9ad8\u6bb5\uff0c\u4f4e\u4e8e 0.9 \u89c6\u4e3a 0\uff0c\u9ad8\u4e8e 1 \u89c6\u4e3a 1\u3002\n\/\/ correctionWeight = (1 - highRoughnessMask) * (1 - damageOrRegionBlend)\u3002\n\/\/ \u6240\u4ee5 roughness \u8d8a\u63a5\u8fd1 1\uff0c\u6574\u7ec4\u65b9\u5411\u6027\/ramp\/specular \u4fee\u6b63\u8d8a\u5f31\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1a\n\/\/ damageOrRegionBlend = _671 = 0\n\/\/ highRoughnessMask = saturate((roughness - 0.9) \/ 0.1)\n\/\/ roughness <= 0.9 -> highRoughnessMask=0\uff0c\u4fee\u6b63\u5b8c\u6574\u4fdd\u7559\n\/\/ roughness = 0.95 -> highRoughnessMask=0.5\uff0c\u4fee\u6b63\u51cf\u534a\n\/\/ roughness >= 1.0 -> highRoughnessMask=1\uff0c\u6574\u7ec4\u4fee\u6b63\u88ab\u5b8c\u5168\u5173\u95ed\n\/\/\n\/\/ \u7b49\u6548\u5f0f\uff1a\n\/\/ materialLightingCorrection = directionalSpec + rampSpec - metallicDiffuseLoss\n\/\/ diffuseBeforeFinalGrade = baseDiffuse1\n\/\/                         + (1 - highRoughnessMask)\n\/\/                         * (1 - damageOrRegionBlend)\n\/\/                         * materialLightingCorrection\nfloat highRoughnessMask = (min(max(roughness, 0.9), 1.0) - 0.9) * 10.0; \/\/ _1826.._1829\nfloat damageOrRegionBlend = _671;                                      \/\/ \u5f53\u524d\u4e3a 0\nfloat correctionWeight =\n    (1.0 - highRoughnessMask)\n  * (1.0 - damageOrRegionBlend);                                       \/\/ _1831\n\nfloat3 materialLightingCorrection =\n    directionalSpec\n  + rampSpec\n  - metallicDiffuseLoss;                                               \/\/ _1833,_1835,_1837\n\nfloat3 diffuseBeforeFinalGrade =\n    baseDiffuse1\n  + correctionWeight * materialLightingCorrection;                     \/\/ _1841.._1843<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u9636\u6bb5 5\uff1a\u8f93\u51fa\u524d\u5f3a\u5ea6\u4e0e\u53bb\u9971\u548c\u3002<\/strong>\u5f53\u524d <code>cb4[2480].y=1<\/code>\u3001<code>cb4[2496].y=0<\/code>\uff0c\u6240\u4ee5\u5f3a\u5ea6\u589e\u76ca\u4e0e\u53bb\u9971\u548c\u90fd\u7b49\u6548\u5173\u95ed\uff0cshader \u53ea\u5bf9\u4e0a\u4e00\u6b65 diffuse \u505a <code>saturate<\/code> \u540e\u5199\u5165 RT3.rgb\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u53c2\u6570\u8bed\u4e49\uff1a\n\/\/ cb4&#91;2480].y \u662f\u6700\u7ec8 diffuse \u5f3a\u5ea6\uff1b\u589e\u5927\u5219\u6574\u4f53\u66f4\u4eae\uff0c\u4f46\u4f1a\u88ab saturate \u622a\u5230 1\u3002\n\/\/ cb4&#91;2496].y \u662f\u53bb\u9971\u548c\u5f3a\u5ea6\uff1b0 \u4fdd\u6301\u5f69\u8272\uff0c1 \u5b8c\u5168\u53d8\u6210 luma \u7070\u5ea6\u3002\n\/\/\n\/\/ \u5f53\u524d\u6570\u503c\u4ee3\u5165\uff1acb4&#91;2480].y = 1, cb4&#91;2496].y = 0\n\/\/ \u7b49\u6548\u5f0f\uff1aRT3.rgb = saturate(diffuseBeforeFinalGrade)\n\/\/ \u6240\u4ee5\u5f53\u524d cloth \u7684 RT3.rgb \u4e0d\u505a\u989d\u5916\u589e\u76ca\uff0c\u4e5f\u4e0d\u505a\u53bb\u9971\u548c\u3002\nfloat3 graded = saturate(diffuseBeforeFinalGrade * cb4&#91;2480].y \/* 1 *\/); \/\/ _1849.._1851\nfloat luma = dot(graded, float3(0.3, 0.59, 0.11));               \/\/ _1852\nfloat desat = cb4&#91;2496].y \/* 0 *\/;                              \/\/ _1854\n\nfloat3 RT3_rgb = graded + desat * (luma.xxx - graded);           \/\/ _1861.._1863\n\nSV_Target3.x = RT3_rgb.r;\nSV_Target3.y = RT3_rgb.g;\nSV_Target3.z = RT3_rgb.b;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/details>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. LightingPass &amp; Gbuffer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ecelightingPass\u7684\u6700\u7ec8RGB\u5408\u6210\u6765\u770b\uff0c\u4e00\u5171\u53ef\u4ee5\u5206\u4e3a\u4e09\u5757RGB\uff1a<strong>MainRGB\uff1bExtraRGB\uff1bSSSRGB<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u6b64\uff0c\u540e\u7eed\u8ba8\u8bbaRT\u7684\u65f6\u5019\uff0c\u9700\u8981\u8003\u8651\u5176\u4e0e\u54ea\u4e2aRGB\u9879\u76f8\u5173<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-23.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"860\" height=\"536\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-23.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1866\"  sizes=\"auto, (max-width: 860px) 100vw, 860px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT1.rg<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-24.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"859\" height=\"535\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-24.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1867\"  sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT1.b<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-25.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"534\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-25.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1868\"  sizes=\"auto, (max-width: 858px) 100vw, 858px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT1.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RT1.rg: normal \u663e\u7136\u548c\u6df1\u5ea6\u4e00\u6837\uff0c\u662f\u4e00\u9879 base \u6570\u636e<\/li>\n\n\n\n<li>RT1.b: ramp\u91c7\u6837\u7ed3\u679c\uff0c\u9634\u5f71\u63a7\u5236 \u4ec5\u4ec5\u4e0emainRGB\u6709\u5173<\/li>\n\n\n\n<li>RT1.a: \u76ee\u6d4b\u6ca1\u4ec0\u4e48\u7528\u7684channel<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-26.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"781\" height=\"487\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-26.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1869\"  sizes=\"auto, (max-width: 781px) 100vw, 781px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT2.rgb<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT2_A_low4_material_id_annotated.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT2_A_low4_material_id_annotated.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1870\"  sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT2.a_low4<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT2_A_high3_light_layer_annotated.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT2_A_high3_light_layer_annotated.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1871\"  sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT2.a_high3<\/p>\n<\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RT2.rgb: \u6750\u8d28\u5149\u7167\u80fd\u91cf\u56e0\u5b50\uff0c\u53ea\u4e0e<strong>mainRGB<\/strong>\u6709\u5173<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u5199\u5165RT2\u65f6\uff0c\u5bf9\u7ebf\u6027\u80fd\u91cf\u7a7a\u95f4\u5f00\u6839\u53f7\nRT2.rgb = sqrt(saturate(linearMaterialEnergy.rgb));\n\n\/\/ \u4f7f\u7528\u65f6\uff0c\u5e73\u65b9\u56de\u53bb\nmaterialEnergy = t2.rgb * t2.rgb;\nbaseLitColor ~= t3Diffuse * materialEnergy * toonBand;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RT2.a \u5355\u901a\u9053\u5b58\u4e24\u4e2a\u503c\uff0c\u4f5c\u4e3a\u4e24\u4e2amask<\/li>\n\n\n\n<li>RT2.a_low4 \u8fd9\u91cc\u53ea\u67090 12 13\u4e09\u4e2a\u503c\u300212 = \u6b63\u5e38\u6750\u8d28\uff1b 13 = outline\u63cf\u8fb9\u533a\u57df   \u8fd9\u4e2a\u503c\u4e0e<strong>mainRGB<\/strong>\u548c<strong>sssRGB<\/strong>\u90fd\u6709\u5173\uff0c\u7c7b\u4f3c\u6750\u8d28\u5206\u652f\u3002\u4f46\u5728\u5f53\u524dsssRGB\u4e2d\uff0c\u53ea\u6709id = 5\u6709\u7279\u6b8a\u7684sss\u5206\u652f\uff0c\u56e0\u6b64\u76f8\u5f53\u4e8e\u6ca1\u6709<\/li>\n\n\n\n<li>RT2.a_high3 \u8fd9\u91cc\u53ea\u67090\/1\uff0c\u6807\u8bb0\u4e86\u89d2\u8272\u533a\u57df\uff08\u6709\u70b9\u50cfstencil\uff1f\uff09 \u8fd9\u4e2a\u503c\u4ec5\u4ec5\u548c<strong>extraRGB<\/strong>\u6709\u5173\uff0c\u7528\u4f5cmask<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-27.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"486\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-27.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1876\"  sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT3.rgb<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-28.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"782\" height=\"487\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-28.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1877\"  sizes=\"auto, (max-width: 782px) 100vw, 782px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT3.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RT3.rgb diffuse \u5f53\u7136\u548c\u4e09\u9879\u90fd\u6709\u5173\uff0c\u6240\u6709\u7684RGB\u9879\u672c\u8d28\u4e0a\u5c31\u662f\u5bf9diffuse\u7684\u8c03\u8272<\/li>\n\n\n\n<li>RT3.a \u4e0d\u53c2\u4e0e\u5b9e\u9645lighting\u8fc7\u7a0b<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_R_id_mask_annotated.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_R_id_mask_annotated.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1878\"  sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT6.r<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_G_id_mask_annotated.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_G_id_mask_annotated.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1879\"  sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT6.g<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25%\">\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_A_id_mask_annotated.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/RT6_A_id_mask_annotated.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1880\"  sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"border-width:1px;padding-top:8px;padding-right:8px;padding-bottom:8px;padding-left:8px\">RT6.a<\/p>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">RT6 \u4e09\u5f20mask RT6.b\u6ca1\u6709\u88ab\u4f7f\u7528<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RT6.r \u4ec5\u67090\/13\u4e24\u4e2a\u503c\uff08float 0.05098 = 13\/255 \uff09\u53c2\u4e0eSSS\uff08\u6b21\u8868\u9762\u6563\u5c04\uff09\u7684\u8ba1\u7b97\u8fc7\u7a0b \u5177\u4f53\u6765\u8bf4\u662f\u4f5c\u4e3a\u6750\u8d28\u5c5e\u6027\uff0c\u51b3\u5b9aPart 1 uv offset\u7684\u8ba1\u7b97\u8fc7\u7a0b\u4e2d\u7684\u56e0\u5b50 sssMaterialStrength<\/li>\n\n\n\n<li>RT6.g  \u76ee\u524d\u4e0d\u53c2\u4e0elighting\u5408\u6210\uff08\u5206\u652f\u5728\u5f53\u524d\u60c5\u51b5\u4e0b\u4e0d\u6267\u884c\uff09<\/li>\n\n\n\n<li>RT6.b \u7591\u4f3c\u53c2\u4e0emainRGB\u4e2d\u7684\u4e00\u9879\uff0ceffectRGB\u7684\u5408\u6210\uff0c\u731c\u6d4b\u662fVFX pass\u4f7f\u7528\u3002\u5f53\u524d\u622a\u5e27\u4e2d\u5168\u90fd\u5199\u51650<\/li>\n\n\n\n<li>RT6.a  \u76ee\u524d\u4e0d\u53c2\u4e0elighting\u5408\u6210\uff08\u6ca1\u6709\u627e\u5230\u76f8\u5173\u903b\u8f91\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u6b21\u8868\u9762\u6563\u5c04<\/strong>\uff08Subsurface scattering\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SSS\u7528\u4e8e\u4f53\u73b0\uff1a\u5149\u7a7f\u900f\u8584\u7684\uff0c\u6709\u900f\u660e\u7279\u5f81\u7684\u7269\u4f53\u65f6\uff0c\u5728\u7269\u4f53\u5185\u90e8\u6563\u5c04\u7684\u89c6\u89c9\u6548\u679c\u3002\u5982\u76ae\u80a4\u7684\u7ea2\u6da6\uff0c\u900f\u5149<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSS\u76f8\u5173gbuffer\uff1aRT6.r \u6750\u8d28 \uff1bRT3.rgb diffuse \uff1bRT1.rg \u6cd5\u7ebf\uff1bRT2.a_low4 \u6750\u8d28\uff1b\u4e24\u5f20\u6df1\u5ea6\u8d34\u56fe<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728Wuwa NPR\u4e2d\uff0c\u4f7f\u7528\u8fd1\u4f3c\u5b9e\u73b0\uff1a\u901a\u8fc7\u5bfb\u627eobject\u7684\u201c\u8fb9\u7f18\u201d\uff0c\u6765\u786e\u5b9aSSS\u8c03\u5236\u5f3a\u5ea6<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u8fc7\u7a0b\u53ef\u4ee5\u88ab\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1a\u786e\u5b9a\u8981\u5bf9\u6bd4\u90a3\u4e2a\u70b9\u7684offset\uff0c\u7b97\u51fa\u6df1\u5ea6\u5deethickness\u9879\uff0c\u4ee5\u53ca\u4e0eRGB\u8fdb\u884c\u5408\u6210\uff0c\u6700\u7ec8\u8f93\u51fa\u4e00\u4e2a\u53ef\u4ee5\u52a0\u5230final color\u4e0a\u7684\u989c\u8272\u5206\u91cf<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>Part 1\uff1auv offset<\/strong><\/summary>\n<pre class=\"wp-block-code\"><code>uvProbeOffset =\n    screenDirection\n  * sssMaterialStrength   \/\/ _1115, cloth \u5f53\u524d 0.203922\n  * probeScale;           \/\/ _1216<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u56e0\u5b50\u4ee3\u8868\u7740\uff0c\u5f85\u5bf9\u6bd4\u7684 pixel \u76f8\u5bf9\u4e8e\u5f53\u524d pixel \u7684 uv \u504f\u79fb<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">screenDirection \u91c7\u6837\u81eaRT1.rg\uff0c\u5e76\u6620\u5c04\u81f3\u5c4f\u5e55\u7a7a\u95f4\uff0c\u4ee3\u8868\u5bfb\u627e\u7684\u65b9\u5411\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sssMaterialStrength \u91c7\u6837\u81eaRT6.r\uff0c\u5e76\u7ecf\u8fc7\u5904\u7406\uff0c\u4e3a\u5b9a\u503c\uff0c\u4ee3\u8868\u6750\u8d28\u5c5e\u6027<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">probeScale \u662f\u9010\u50cf\u7d20\u7684\u5f3a\u5ea6\u53d8\u91cf\uff0c\u5176\u8bed\u4e49\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u8584\u6750\u8d28 \/ \u8f6e\u5ed3 \/ \u9006\u5149\u533a\u57df\u66f4\u5bb9\u6613\u900f\u5149\uff1b<br>\u6b63\u9762\u3001\u539a\u5904\u3001\u975e\u8fb9\u7f18\u533a\u57df\u4e0d\u5e94\u8be5\u660e\u663e\u900f\u5149\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u503c\u8d8a\u5927\uff0c\u8bf4\u660e\u8fd9\u91cc\u5c5e\u6027\u4e0a\u66f4\u5bb9\u6613\u900f\u5149\uff0c\u53cd\u6620\u5728shader\u4e2d\u5c31\u662f\uff0coffset\u53d8\u5927\u4e86\uff0c\u627e\u5bfb\u4e00\u4e2a\u66f4\u8fdc\u7684pixel\u8fdb\u884cdepth\u6bd4\u8f83\uff0c\u81ea\u7136\u66f4\u5bb9\u6613\u5f97\u5230\u4e00\u4e2a\u5927\u7684\u6df1\u5ea6\u5dee\uff0c\u8fdb\u800c\u5f97\u5230\u66f4\u5f3a\u7684SSS\u8c03\u5236\u6548\u679c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>probeScale =\n    normalFacingTerm\n  * grazingViewTerm\n  * backLightViewTerm\n  * distanceScale;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ float3 SSSDirection = cb1&#91;4784].xyz;\n\/\/ = float3(-0.7094065, -0.4967318, 0.5) \u573a\u666f\u4e3b\u5149\u65b9\u5411\n\nnormalFacingTerm = (dot(SSSDirection, N) + 1) * 0.00375 + 0.0075; \n\n\/\/ \u8303\u56f4 0.0075 - 0.015<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u770b\u5f53\u524d\u6cd5\u7ebf <code>N<\/code> \u662f\u5426\u671d\u5411\u9884\u8bbe\u7684 SSS \u65b9\u5411\u3002<br>\u8bed\u4e49\u662f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6750\u8d28\u9700\u8981\u63a5\u6536\u4e00\u5b9a\u7684\u6b63\u9762\u5149\u7167\u624d\u6709SSS\u3002SSS\u662f <strong>\u53cd\u5c04 + \u900f\u5c04<\/strong>\uff0c\u800c\u4e0d\u662f\u7269\u7406\u76f4\u89c9\u4e0a\u53ea\u6709\u900f\u5c04\u5c31\u53ef\u4ee5\u3002\u56e0\u6b64\u5728\u56e0\u5b50\u5206\u79bb\u65f6\uff0c\u628a\u53cd\u5c04\u9879\u548c\u900f\u5c04\u9879\u72ec\u7acb\u7684\u62c6\u89e3\u51fa\u6765\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5c04\u9879\u5e0c\u671b\u5149\u76f4\u5c04\u8868\u9762\uff08\u8fd9\u91ccSSSDirection\uff0c\u5373\u8868\u9762\u671d\u5411\u5149\u7684\u5411\u91cf\uff0c\u4e0enormal\u540c\u5411\u4ee3\u8868\u5149\u6e90\u4e0e\u7269\u4f53\u53d7\u5149\u9762\u540c\u4fa7\uff0c\u5373\u5149\u6e90\u76f4\u7167\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u9762\u7684\u7b2c\u4e09\u9879 backlightViewTerm \u5219\u66f4\u5e0c\u671b\u89c6\u7ebf\u65b9\u5411\u4e0e\u5149\u5411\u91cf\u76f8\u53cd\uff0c\u5373\u201c\u80cc\u5149\u201d\uff0c\u5f3a\u8c03\u900f\u5c04\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u9879\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>grazingViewTerm = saturate(0.8 - saturate(dot(V, N)));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u770b\u89c6\u7ebf\u662f\u4e0d\u662f\u63a0\u5c04\u89d2\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dot(V, N) \u9ad8\uff1a\u4f60\u6b63\u5bf9\u8868\u9762\u770b\uff0c\u900f\u5149\u5f31\uff0cprobe \u53d8\u5c0f\u3002\ndot(V, N) \u4f4e\uff1a\u4f60\u659c\u7740\u770b\u8fb9\u7f18\uff0c\u900f\u5149\u5f3a\uff0cprobe \u53d8\u5927\u3002\n\u6709\u6548\u503c\uff1a0 - 0.8<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u5b83\u5f3a\u8c03\u8f6e\u5ed3\u8fb9\u3001\u5e03\u6599\u8fb9\u7f18\u3001\u8584\u7247\u8fb9\u7f18\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e09\u9879\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>x = saturate((-0.5 - dot(SSSDirection, V)) * 2);\nbackLightViewTerm = x*x*(3 - 2*x) + 1;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u770b\u89c6\u7ebf\u65b9\u5411\u548c SSS \u65b9\u5411\u7684\u5173\u7cfb\u3002<br>\u8bed\u4e49\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u5f53\u89c2\u5bdf\u65b9\u5411\u66f4\u63a5\u8fd1\u201c\u80cc\u5149\/\u7a7f\u900f\u65b9\u5411\u201d\u65f6\uff0c\u63d0\u9ad8 probe \u5f3a\u5ea6\u3002\n\n\u6709\u6548\u503c\u8303\u56f4\uff1a1.0 ~ 2.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u56db\u9879\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ rawdepth\u662f\u4ecedepth buffer\u4e2d\u91c7\u6837\u51fa\u7684\u539f\u59cbz\uff0creverse-z \u98ce\u683c\n\/\/ \u8fd9\u91cc\u901a\u8fc7\u53d8\u6362\uff0c\u628a\u6df1\u5ea6\u653e\u7f29\u523010 - \u65e0\u7a77\u7684\u7a7a\u95f4\uff0c\u540c\u65f6reverse\uff0c\u8ba9\u6df1\u5ea6\u503c\u8d8a\u5927 = \u8d8a\u6df1\nfloat viewDepth = 1.0 \/ (0.1 * rawDepth + 0.00000001);\n\nfloat nearTerm =\n    (50.0 - min(depth, 50.0)) * 0.02;\n\nfloat farTerm =\n    pow((3000.0 - min(depth, 3000.0)) \/ 3000.0, 8.0);\n\nfloat distanceTerm =\n    nearTerm - 1.0 + farTerm;\n\n\/\/ \u51fd\u6570\u9879\u968fdepth\u589e\u5927\u800c\u51cf\u5c0f\uff0c\u4ee3\u8868\u5bf9\u8fdc\u5904\u9879\u7684\u538b\u5236\n\nfloat distanceScaleParam =\n    cb1&#91;2128].x * 0.572958;\n\/\/ = 0.7947066 * 0.572958\n\/\/ = 0.4553335\n\nfloat distanceScale =\n    1.0 + distanceScaleParam * distanceTerm;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bed\u4e49\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u8ddd\u79bb\u4fee\u6b63\uff0c\u8fd1\u5904\u53ef\u4ee5\u504f\u5927\u4e00\u70b9\uff0c\u8fdc\u5904\u8981\u538b\u5c0f\uff0c\u907f\u514d\u8fdc\u5904\u8fb9\u7f18\u900f\u5149\u8fc7\u5bbd\nrawDepth 0.05536 -&gt; distanceScale \u2248 0.820\nrawDepth 0.06278 -&gt; distanceScale \u2248 0.838 \u6709\u6548\u503c\u5927\u6982\u5c31\u662f\u8fd9\u4e2a\u533a\u95f4\u5185<\/code><\/pre>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>Part 2\uff1a<\/strong><strong>thickness<\/strong><\/summary>\n<pre class=\"wp-block-code\"><code>float2 uvProbeOffset;\n\nuvProbeOffset.x =\n    screenDirection.x\n  * sssMaterialStrength\n  * probeScale;\n\nuvProbeOffset.y =\n   -screenDirection.y\n  * sssMaterialStrength\n  * probeScale\n  * 0.5;\n\nfloat2 offsetUV = screenUV + uvProbeOffset;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7\u8fd9\u6837\u7684search\uff0c\u627e\u5230\u4e86\u4e00\u4e2a\u5bf9\u5e94\u4f4d\u7f6e\u7684pixel\uff0c\u5c31\u662f\u5f53\u524d\u5bf9\u6bd4\u6df1\u5ea6\u7684\u5bf9\u8c61<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u91c7\u6837\u548c\u7ebf\u6027\u5316\nfloat offsetRawDepth =\n    Texture2D6.Sample(sampler2, offsetUV).r;\n\nfloat offsetViewDepth =\n    1.0 \/ (0.1 * offsetRawDepth + 0.00000001);\n\nfloat currentRawDepth =\n    Texture2D0.SampleLevel(sampler0, screenUV, 0).r;\n\nfloat currentViewDepth =\n    1.0 \/ (0.1 * currentRawDepth + 0.00000001);\n\nfloat depthDelta =\n    max(offsetViewDepth - currentViewDepth, 0.0001);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u6709\u4e00\u4e2a\u7279\u6b8a\u7684\u70b9\uff1a\u672c\u4f53depth\u91c7\u6837\u662f\u5728\u9ed8\u8ba4\u7684\u6df1\u5ea6\u8d34\u56fe D32S8 \u4e0a\u91c7\u6837\u7684\uff0c\u4f46 search \u70b9 depth \u91c7\u6837\u662f\u5728\u4e13\u95e8\u7684\u4e00\u5f20\u7ebf\u6027\u6df1\u5ea6\u8d34\u56fe R16 \uff08gbuffer RT5\uff09 \u4e0a\u91c7\u6837\u7684\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float t =\n    saturate((depthDelta - 0.0) \/ 50.0);\n\nfloat thickness =\n    t * t * (3.0 - 2.0 * t);\n\/\/ \u5927\u6982\u53d6\u503c\u662f\u8fd9\u6837\n\/\/ depthDelta = 0  -&gt; thickness = 0\n\/\/ depthDelta = 25 -&gt; thickness = 0.5\n\/\/ depthDelta = 50 -&gt; thickness = 1\n\n\nfloat3 sssRGB =\n    distanceFade\n  * thickness\n  * cb0&#91;16].rgb\n  * sssResponseRGB;<\/code><\/pre>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>Part 3<\/strong>\uff1a<strong>sssResponseRGB<\/strong><\/summary>\n<p class=\"wp-block-paragraph\">sssResponseRGB \u4ee3\u8868\u4e00\u4e2aSSS\u989c\u8272\u57fa\u51c6\u503c\uff0c\u8ba1\u7b97\u6d41\u7a0b\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 1. shader \u5148\u5904\u7406 cb1&#91;4768].rgb\uff0c\u5148\u505a\u4e00\u4e2a\u201c\u964d\u4f4e\u9971\u548c\u5ea6\u201d\u7684\u7248\u672c\nfloat3 sssColor = float3(2.6, 3.45464, 4.0);\n\nfloat luma =\n    dot(sssColor, float3(0.3, 0.59, 0.11));\n\/\/ = 2.6*0.3 + 3.45464*0.59 + 4.0*0.11\n\/\/ \u2248 3.25824\n\nfloat3 desaturatedSssColor =\n    luma + (sssColor - luma) * 0.75;\n\n\/\/ \u7ea6\u7b49\u4e8e\uff1a\ndesaturatedSssColor \u2248 float3(2.76456, 3.40524, 3.81456);\n\n\/\/ 2. \u7528 screenMask = _451 \u628a\u4e24\u4e2a\u7248\u672c\u7684\u503c\u505a\u63d2\u503c\n\/\/ \u8003\u8651\u5230\u8fd9\u91cct5\u662f\u5168\u767d\uff0c\u8fd9\u91ccscreen mask\u6052\u4e3a2\nscreenMask = (t5.r * t5.b) * (t5.r * t5.b) * 2.0;\n\n\/\/ screenSssColor = 2 * sssColor - desatSssColor;\n\/\/ \u8fd9\u4e2a\u5c31\u662f SSS \u57fa\u7840 rgb \u989c\u8272\uff0c\u540e\u9762\u662f\u7b97\u7cfb\u6570\nfloat3 screenSssColor =\n    lerp(desaturatedSssColor, sssColor, screenMask);\n\n\/\/ 3. SSS\u53cd\u5c04\u9879 normalLightResponse\n\/\/ float3 SSSDirection = float3(-0.7094065, -0.4967318, 0.5);\n\/\/ dot(S,N) &lt;= -0.2 -&gt; 0\n\/\/ dot(S,N) = -0.1 -&gt; 0.5\n\/\/ dot(S,N) &gt;= 0   -&gt; 1\n\/\/ \u4ece\u4e4b\u524d\u7684\u5224\u65ad\u4e2d\uff0c\u8fd9\u4e00\u9879\u4ee3\u8868\u6cd5\u7ebf\u662f\u5426\u504f\u79bb\u4e86\u5149\u7167\u65b9\u5411\uff0c0-1\u4ee3\u8868\u6b63\u5e38\u9762\u5411\uff0c-0.2-0\u4ee3\u8868\u53ef\u63a5\u53d7\u7684\u504f\u79fb\u548c\u5e73\u6ed1\uff0c\u5c0f\u4e8e-0.2\u5c31\u76f4\u63a5\u538b\u62100\nnormalLightResponse = smoothstep(-0.2, 0.0, dot(SSSDirection, N));\n\n\/\/ 4. \u4e00\u4e2a\u7ecf\u9a8c\u62df\u5408\u7684\u9ad8\u5149\u5206\u5e03\u51fd\u6570 specViewTerm\n\/\/ NoH = 0   -&gt; specViewTerm \u2248 0.0955\n\/\/ NoH = 0.5 -&gt; specViewTerm \u2248 0.129\n\/\/ NoH = 1   -&gt; specViewTerm \u2248 2.387\n\/\/ \u4f5c\u7528\uff1a\u534a\u89d2\u65b9\u5411\u63a5\u8fd1\u6cd5\u7ebf\u65f6\u589e\u5f3a\nfloat3 H =\n    normalize(V + SSSDirection);\n\nfloat NoH =\n    saturate(dot(N, H));\n\nfloat NoH2 =\n    NoH * NoH;\n\nfloat specViewTerm =\n    0.3 \/\n    (\n        (3.14159 - NoH2 * 2.51327)\n      * (1.0 - NoH2 * 0.8)\n    );\n\n\/\/ 5. \u80cc\u5149\/\u4fa7\u9006\u5149\u89c2\u5bdf\u9879\nfloat VoL =\n    dot(SSSDirection, V);\n\n\/\/ 6. \u5f97\u5230 SSS \u65b9\u5411\u54cd\u5e94\u5f3a\u5ea6 _1237\nfloat sssDirectionalResponse =\n    (\n        ((normalLightResponse * 0.32 + 0.08) * (1.0 - VoL))\n      + (normalLightResponse * screenMask * specViewTerm)\n    )\n  * (screenMask * 0.5 + 0.5);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e00\u9879\uff1a<br>(normalLightResponse * 0.32 + 0.08) * (1 &#8211; VoL)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u63d0\u4f9b\u57fa\u7840\u900f\u5149\u54cd\u5e94<\/li>\n\n\n\n<li>\u5373\u4f7f normalLightResponse = 0\uff0c\u4e5f\u8fd8\u6709 0.08 \u7684\u5e95\u503c<\/li>\n\n\n\n<li>\u80cc\u5149\u65f6 viewDotLight \u66f4\u5c0f\uff0c1-viewDotLight \u66f4\u5927<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c\u4e8c\u9879\uff1a<br>normalLightResponse * screenMask * specViewTerm<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ad8\u5149\u9879<\/li>\n\n\n\n<li>NoH \u8d8a\u9ad8\uff08\u76f4\u5c04\uff09\uff0c\u8d8a\u5f3a<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 7. \u5f97\u5230\u57fa\u7840 SSS \u5f69\u8272\u54cd\u5e94\nfloat3 sssBaseColor =\n    screenSssColor * sssDirectionalResponse;\n\n\/\/ 8. \u4e24\u5957\u6750\u8d28\u54cd\u5e94\n\/\/ \u8fd9\u91cc\u7684materialRGB\u76f4\u63a5\u5c31\u662fRT3 diffuse\u7684\u91c7\u6837\u503c\uff0c\u8fd9\u91cc\u6ca1\u6709\u7279\u6b8a\u6548\u679c\u5b58\u5728\nfloat3 responseA =\n    (materialRGB + 1.0) * 0.1 * sssBaseColor;\n\nfloat3 darkBoostMask =\n    saturate(1.0 - materialRGB * 1.2);\n\nfloat3 darkBoost =\n    1.0\n  + darkBoostMask * darkBoostMask * 14.0 * (3.0 - 2.0 * darkBoostMask);\n\nfloat3 responseB =\n    materialRGB * 0.1 * sssBaseColor * darkBoost;\n\n\/\/ \u6700\u540e\u5728\u4e24\u8005\u4e4b\u95f4\u63d2\u503c\uff0c\u5176\u5b9e\u662f\u9009\u62e9\u4e86B\nfloat responseBlend = cb1&#91;4720].z;\n\/\/ \u5f53\u524d = 1.0\n\nfloat3 sssResponseRGB =\n    lerp(responseA, responseB, responseBlend);\n\n\/\/ \u5f53\u524d responseBlend = 1\uff0c\u6240\u4ee5\u6211\u4eec\u7684\u76ee\u6807\u503c\uff1a\nsssResponseRGB = responseB;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u7eed\u8fd9\u4e2a<strong>sssResponseRGB<\/strong>\uff0c\u4e0e\u4e4b\u524d\u91c7\u6837depth\u5f97\u5230\u7684thickness\u4e00\u8d77\uff0c\u7ec4\u6210\u4e86sssRGB<\/p>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>\u540e\u7eed\u5408\u6210<\/strong>\uff1asssRGB \u4e0e lightpass \u8f93\u51fa<\/summary>\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2asssRGB\u662f\u76f4\u63a5\u52a0\u5230basecolor\u4e0a\u9762\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0clightpass\u7684\u8f93\u51fa\u7ed3\u679c\u4e00\u5171\u6709\u4e09\u5757\uff1a<\/p>\n\n\n\n<div class=\"term-list\">\n  <p><strong>MainRGB<\/strong><br>\u4e3b\u6750\u8d28\u5149\u7167\u7ed3\u679c\uff1a\u6750\u8d28\u989c\u8272\u3001\u4e3b\u5149\/\u9634\u5f71\u3001toon\/spec\/material response \u7b49\u524d\u9762\u5df2\u7ecf\u6df7\u597d\u7684\u4e3b\u4f53\u989c\u8272\u3002<\/p>\n  <p><strong>ExtraRGB<\/strong><br>\u6765\u81ea\u4e00\u4e2a light\/volume \u5faa\u73af\uff0c\u8bfb\u53d6 <code>cbuffer3<\/code> \u91cc\u7684\u591a\u7ec4 light \u53c2\u6570\uff0c\u6309\u8ddd\u79bb\u3001\u65b9\u5411\u3001\u8870\u51cf\u3001mask \u7d2f\u52a0\u3002\u66f4\u50cf\u5c40\u90e8\u8865\u5149 \/ \u9644\u52a0\u5149\u7167 \/ \u7279\u6b8a\u5f71\u54cd\u4f53\u79ef\u3002<\/p>\n  <p><strong>sssRGB<\/strong><br>\u6765\u6e90\u662f\u524d\u9762\u5206\u6790\u7684 SSS\uff1a<br><code>thickness * distanceFade * cb0[16].rgb * sssResponseRGB<\/code><\/p>\n<\/div>\n<\/details>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">MainRGB<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">mainRGB\u4e3a\u4e3b\u8981\u6750\u8d28\u989c\u8272\u9879<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mainRGB\u76f8\u5173gbuffer\uff08\u6df1\u5ea6\u6cd5\u7ebf\u5c31\u4e0d\u63d0\u4e86\uff09\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RT1.b ramp\uff1b RT2.rgb light\uff1b RT2.a_low4 matid \uff1bRT3.rgb diffuse<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary><strong>MainRGB \u8be6\u7ec6\u8ba1\u7b97\u4ee3\u7801<\/strong><\/summary>\n<pre class=\"wp-block-code\"><code>float smoothstep01(float x)\n{\n    x = saturate(x);\n    return x * x * (3.0 - 2.0 * x);\n}\n\n\n\/\/ ------------------------------\n\/\/ 1. depth -&gt; linearViewDepth\n\/\/ ------------------------------\n\n\/\/ \u5728\u5f53\u524draw depth 0.05 - 0.06\u65f6\uff0clinearViewDepth \u7ea6\u4e3a 160 - 180\nlinearViewDepth = 1 \/ (0.1 * rawDepth + 0.00000001)\n\n\n\/\/ ------------------------------\n\/\/ 3. distanceBlend\n\/\/ ------------------------------\n\n\/\/ cb1_4816.x = 0\uff0c\u6240\u4ee5 max \u540e\u7528 0.001\u3002\n\/\/ cb1_4816.y = 1\n\/\/ \u56e0\u6b64\u53ea\u8981 linearViewDepth &gt; 0.001\uff0cdistanceBlend \u5c31\u4f1a\u9971\u548c\u5230 1\u3002\n\/\/ \u7ea6\u7b49\u4e8e distanceBlend = saturate(linearViewDepth \/ 0.001);\n\/\/ \u4e5f\u5c31\u662f\u6052\u7b49\u4e8e1\uff08\u7ebf\u6027\u6df1\u5ea6\u57fa\u672c\u6ca1\u6709\u5c0f\u4e8e0.001\u7684\uff09\nfloat distanceBlend =\n    pow(\n        saturate(linearViewDepth \/ max(cb1_4816.x, 0.001)),\n        cb1_4816.y\n    );\n\n\/\/ ------------------------------\n\/\/ 4. Main material \u8f93\u5165\n\/\/ ------------------------------\n\n\/\/ \u5f53\u524d cb1&#91;4576].y = 0\uff0c\u4e0d\u8d70\u989d\u5916 t9 \u8c03\u5236\uff0cmaterialRGB \u76f4\u63a5\u6765\u81ea RT3.rgb\u3002\nfloat3 materialRGB = RT3_rgb;\n\n\/\/ RT2.rgb \u8fd9\u91cc\u5e73\u65b9\uff0c\u5b9e\u9645\u4e0a\u662f\u5199\u5165\u7684\u65f6\u5019\u5f00\u65b9\u4e86\uff0c\u4fdd\u5b58\u6697\u90e8\u7ec6\u8282\nfloat3 rt2Color = RT2.rgb * RT2.rgb;\n\n\n\/\/ ------------------------------\n\/\/ 5. toon tint \/ base response\n\/\/ ------------------------------\n\nfloat3 tintA_near = float3(0.500000, 0.500000, 0.500000); \/\/ cb1&#91;4848].rgb\nfloat3 tintA_far  = float3(0.300000, 0.405086, 0.500000); \/\/ cb1&#91;4736].rgb\n\nfloat3 tintB_near = float3(1.0, 1.0, 1.0); \/\/ cb1&#91;4832].rgb\nfloat3 tintB_far  = float3(1.0, 1.0, 1.0); \/\/ cb1&#91;4752].rgb\n\nfloat3 tintA = lerp(tintA_near, tintA_far, distanceBlend);\nfloat3 tintB = lerp(tintB_near, tintB_far, distanceBlend);\n\n\/\/ blend \u4e3a 1\n\/\/ \u56e0\u6b64tintA\u548ctintB\u90fd\u53d6far\n\n\/\/ RT1.b ramp shadow mask\u3002\n\/\/ \u63d0\u4f9b\u5e73\u6ed1\uff0c\u4e14\u4e8c\u503c\u5316\u7684\u9634\u5f71\u7ed3\u679c\nfloat rt1ShadowMask = RT1.b;\n\nfloat baseResponse =\n    0.7 + 0.3 * smoothstep01(saturate(rt1ShadowMask * 2.0));\n\n\/\/ \u4e0b\u754c\u662f\uff080.3\uff0c0.4\uff0c0.5\uff09 \u4e58\u4e0a baseResponse\uff08\u4e00\u4e2a0.7\u52301\u7684\u5e73\u6ed1\u503c\uff0c\u8fd9\u4e2a\u503c\u8d8a\u5c0f\u8bf4\u660e\u8d8a\u63a5\u8fd1shadow\uff09\nfloat3 baseLow =\n    tintA * materialRGB * baseResponse;\n\n\/\/ \u4e0a\u754c\u5c31\u662fdiffuse\u81ea\u5df1\nfloat3 baseHigh =\n    tintB * materialRGB;\n\n\n\/\/ ------------------------------\n\/\/ 6. screenMask \/ shadowRamp \/ shadowMix\n\/\/ ------------------------------\n\n\/\/\n\/\/ \u5f53\u524d cb1&#91;4528].z = 1\u3002\n\/\/ \u5982\u679c t5 \u4e3a\u5168\u767d\uff0c\u5219 screenMask = 1\u3002\nfloat screenMask =\n    (t5.r * t5.b) * (t5.r * t5.b) * cb1_4528.z;\n\n\/\/ \u8fc7\u6e21\u533a mask\uff1a\u540c\u65f6\u8981\u6c42 RT1.b \u8fdb\u5165\u8f83\u4eae\u533a\uff0c\u5e76\u4e14 tintA\/tintB \u6709\u660e\u663e\u5dee\u5f02\u3002\nfloat rt1HighMask =\n    smoothstep01(saturate((rt1ShadowMask - 0.5) * 2.0));\n\n\/\/ tintDifference \u6b64\u5904\u663e\u7136\u4e3a1 tintA\u548ctintB\u90fd\u662f\u5df2\u77e5\u7684\uff0c\u5c31\u76f8\u5f53\u4e00\u4e2amask\nfloat tintDifference =\n    saturate(dot(abs(tintB - tintA), float3(0.3, 0.59, 0.11)) * 10.0);\n\nfloat tintDifferenceMask =\n    smoothstep01(tintDifference);\n\n\/\/ \u5b9e\u9645\u662f\u628aRT1.b\u76840 - 1\u8303\u56f4\u4e2d\uff0c0 - 0.5 \u7684\u503c\u5168\u90fd\u538b\u62100\uff0c0.5 \u5230 1 \u7684\u503c\u5e73\u6ed1\u540e\u653e\u5230 0 - 1\u7684\u8303\u56f4\u5185\n\/\/ \u76ee\u7684\u663e\u7136\u662f\u4e8c\u503c\u5316\u9634\u5f71\uff1a\u5c0f\u4e8e 0.5 \u7684\u4e00\u5f8b\u7684\u89c6\u4e3a\u9634\u5f71\u533a\uff0c\u5728 0.5 \u8fd9\u6761\u8fb9\u5f62\u6210\u660e\u663e\u7684\u5206\u5272\u7ebf\nfloat transitionMask =\n    rt1HighMask * tintDifferenceMask;\n\n\/\/ cb1&#91;4800] = float4(0, 0.1, 1, 0)\nfloat rampMin   = cb1_4800.x; \/\/ 0.0\nfloat rampMax   = cb1_4800.y; \/\/ 0.1\nfloat screenRampBlend = cb1_4800.z; \/\/ 1.0\n\nfloat rampRange = rampMax - rampMin;\n\n\/\/ screenMask = 1\uff0crampRange = 0.1\n\/\/ screenRampU = 1\nfloat screenRampU =\n    saturate((screenMask - rampMin) \/ rampRange);\n\nfloat shapedScreen =\n    smoothstep01(screenRampU) * transitionMask;\n\n\/\/ \u5f53\u524d screenRampBlend = 1\uff0c\u6240\u4ee5 shadowRamp = screenMask = 1\nfloat shadowRamp =\n    lerp(shapedScreen, screenMask, screenRampBlend);\n\n\/\/ shadowRampU = 1\nfloat shadowRampU =\n    saturate((shadowRamp - rampMin) \/ rampRange);\n\nfloat shapedShadow =\n    smoothstep01(shadowRampU) * transitionMask;\n\n\/\/ \u5f53\u524d screenRampBlend = 1\uff0c\u6240\u4ee5 shadowMix = transitionMask\nfloat shadowMix =\n    lerp(shapedShadow, transitionMask, screenRampBlend);\n\n\n\/\/ ------------------------------\n\/\/ 7. detailRGB \/ effectRGB\n\/\/ ------------------------------\n\n\/\/ cb1&#91;4720].x = 1.0\nfloat detailIntensity = cb1_4720.x;\n\n\/\/ cb1&#91;4720].y = 0.65\n\/\/ \u5f53\u524d\u5982\u679c shadowRamp = 1\uff0c\u5219 colorBlend = 1\u3002\nfloat colorBlend =\n    1.0 + (shadowRamp - 1.0) * cb1_4720.y;\n\n\/\/ midTint = 0.5 * tintB = (0.5, 0.5, 0.5)\nfloat3 midTint =\n    lerp(tintA * 0.2, tintB * 0.5, colorBlend);\n\n\/\/ detailRGB\uff1aRT3 diffuse \u88ab RT2.rgb\u00b2 \u8fdb\u4e00\u6b65\u8c03\u5236\u540e\u7684\u6750\u8d28\u7ec6\u8282\u9879\u3002\n\/\/ 0.5 * ramp * diffuse\nfloat3 detailRGB =\n    materialRGB * rt2Color * detailIntensity * midTint;\n\n\/\/ RT6.b \u731c\u6d4b\u662fVFX mask\u3002\n\/\/ \u8d8a\u9ad8\uff0cdetailRGB \u88ab\u653e\u5927\u6210\u66f4\u5f3a\u7684 effect \u9879\u3002\n\/\/ \u4f46\u5f53\u524dframe\u4e2d\uff0c\u8fd9\u4e2a\u503c\u9ed8\u8ba4\u5199\u5165\u51680\uff0c\u4e0d\u542f\u7528\u8fd9\u4e2afeature\nfloat materialEffectMask = RT6_rgb.b;\n\nfloat3 effectRGB =\n    detailRGB * (materialEffectMask * 10.0 * shadowRamp);\n\n\n\/\/ ------------------------------\n\/\/ 8. Main material compose\n\/\/ ------------------------------\n\nfloat3 mainA =\n    baseLow\n  + detailRGB\n  + 0.4 * shadowMix * (baseHigh - baseLow);\n\nfloat3 mainB =\n    baseLow\n  + detailRGB\n  + effectRGB\n  + shadowMix * (baseHigh - (baseLow + detailRGB + effectRGB));\n\n\/\/ colorBlend = 1\uff0c\u9009B\nfloat3 mainMaterialRGB =\n    lerp(mainA, mainB, colorBlend);\n\n\n\/\/ ------------------------------\n\/\/ 9. extra light loop \u5bf9 MainRGB \u7684\u5f71\u54cd\n\/\/ ------------------------------\n\n\/\/ DXIL \u91cc mainLightRemainWeight \u6765\u81ea cbuffer2 \u63a7\u5236\u7684 light\/volume loop\u3002\n\/\/ \u5f53\u524d cbuffer2&#91;2304].x = 0\uff0c\u5faa\u73af\u4e0d\u6267\u884c\uff1a\n\/\/ extraRGB = 0\n\/\/ mainLightRemainWeight = 1\nfloat3 extraRGB = float3(0.0, 0.0, 0.0);\nfloat mainLightRemainWeight = 1.0;\n\nfloat3 MainRGB =\n    mainLightRemainWeight * mainMaterialRGB;\n\n\/\/ \u5f53\u524d\u4e8b\u4ef6\u4e0b\u7b49\u4ef7\u4e8e\uff1a\nMainRGB = mainMaterialRGB;<\/code><\/pre>\n<\/details>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u7ec8\u6574\u7406\u4e00\u4e0bMainRGB\u5728\u5f53\u524d\u8fd9\u79cd\u60c5\u5883\u4e0b\u7684\u7b80\u5316\u8ba1\u7b97\u903b\u8f91\uff08\u5206\u9879\u62c6\u5206\uff09<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>baseLow\uff1a\uff080.3\uff0c0.4\uff0c0.5\uff09 \u4e58\u4e0a \u628aRT1.b \u7684 0 &#8211; 0.5 \u90e8\u5206\u653e\u52300.7 &#8211; 1.0\u7684\u4e00\u4e2a\u56e0\u5b50\u3002\u518d\u4e58diffuse<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u6697\u7684\u533a\u57df\uff0cRT1.b = 0 baseLow = \uff080.21\uff0c0.28\uff0c0.35\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u4eae\u7684\u6697\u533a\u53ca\u4eae\u533a\uff0c\u5373RT1.b &gt;= 0.5 \u65f6\uff0c baseLow = \uff080.3\uff0c0.4\uff0c0.5\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bed\u4e49\uff1a\u53cd\u6620\u6697\u90e8\u7684\u9634\u5f71\u7ec6\u8282\uff0c\u8ba9\u9634\u5f71\u90e8\u5206\u4e0d\u8981\u90fd\u662f\u4e00\u6837\u9ed1<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>detailRGB\uff1a0.5 * ramp * diffuse<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bed\u4e49\uff1a\u4ee3\u8868ramp bake\u5149\u7167\u5bf9diffuse\u7684\u5f71\u54cd<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> effectRGB \u5f53\u524d\u6052\u4e3a 0\uff0c \u5148\u4e0d\u8003\u8651 <\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>shadowMix * (baseHigh &#8211; (baseLow + detailRGB + effectRGB))<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">shadowMix\u662f\u63d2\u503c\u56e0\u5b50\uff0c\u5b9e\u9645\u662f\u628a RT1.b \u7684 0 &#8211; 1\u8303\u56f4\u4e2d\uff0c0 &#8211; 0.5 \u7684\u503c\u5168\u90fd\u538b\u62100\uff0c0.5 \u5230 1 \u7684\u503c\u5e73\u6ed1\u540e\u653e\u5230 0 &#8211; 1\u7684\u8303\u56f4<br>\u8bed\u4e49\uff1a\u4e8c\u503c\u5316\u9634\u5f71\uff1a\u5c0f\u4e8e 0.5 \u7684\u4e00\u5f8b\u7684\u89c6\u4e3a\u9634\u5f71\u533a\uff0c\u5728 0.5 \u8fd9\u6761\u8fb9\u5f62\u6210\u660e\u663e\u7684\u5206\u5272\u7ebf\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">baseHigh \u5c31\u662f diffuse \u81ea\u5df1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u4e0a\u770b\uff0c\u5c31\u80fd\u77e5\u9053detail\u9879\u76840.5\u662f\u600e\u4e48\u6765\u7684\uff1a\u5b9e\u9645\u662f\u4e3a\u4e86\u4fdd\u8bc1\uff0cbaseLow + detailRGB\uff0c\u5bf9diffuse\u7684\u8d21\u732e\u56e0\u5b50\u4e0d\u4f1a\u8d85\u8fc71\uff08baseLow\u5c31\u7b97\u9009near\u4e5f\u624d0.5\uff09\uff0c\u4e5f\u5c31\u662f\u6c38\u8fdc\u4e0d\u4f1a\u8d85\u8fc7baseHigh<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9e\u9645\u4e0a\uff0c\u7531\u4e8egbuffer RT1.b\u7684\u8ba1\u7b97\u903b\u8f91\u6700\u540e\u7684\u653e\u7f29\uff0cshadow\u503c\u7684\u8303\u56f4\u672c\u8eab\u5c31\u662f0.5 \u5230 1\uff0c\u4e0e\u8fd9\u91cc\u76f8\u5bf9\u5e94<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">shadow = 0.5\uff0c\u53d6\u5230\u4e0b\u754c\uff080.3\uff0c0.4\uff0c0.5\uff09* diffuse + 0.5 * ramp * diffuse<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">shadow = 1 \u65f6\uff0c\u53d6\u5230\u4e0a\u754c diffuse<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. TAA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ece daniya \u7684 compute Pass #3\u4e2d\uff0c\u53ef\u4ee5\u8bc6\u522b\u5230\u4e00\u4e2aDOF\u666f\u6df1\u5408\u6210\u7684Dispatch\uff0c\u4e00\u4e2aTAA Dispatch\u3002DOF\u5728\u89d2\u8272\u5c55\u793a\u754c\u9762\u6ca1\u6709\u4f7f\u7528\uff0c\u8fd9\u91cc\u4e3a\u7a7a\u7f6e\uff0c\u731c\u6d4b\u53ef\u80fd\u5728\u5927\u4e16\u754c\u573a\u666f\uff0c\u6216\u8005camera\u529f\u80fd\u4e0b\u542f\u7528\u3002TODO<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u901a\u8fc7\u5206\u6790TAA\u7684\u6267\u884c\u6d41\u7a0b\uff0c\u5b66\u4e60\u4e00\u4e0b\u8fd9\u91cc\u7684\u5b9e\u73b0\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1aTAA\u4f7f\u7528\u7684motion vector\u6765\u81ea\u4e8ebasePass RT4\u7684rg\u901a\u9053<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Dispatch WorkGroup SharedMemory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dispatch(320, 200, 1) + [numthreads(8, 8, 1)]<br>\u4ece\u8fd9\u91cc\u7684\u8bbe\u8ba1\u6765\u770b\uff0c\u524d\u4e24\u9879\u901a\u5e38\u662f\u5bf9\u5e94\u56fe\u50cf\u7684width \u548c height\uff0c\u4e58\u8d77\u6765\u6b63\u597d\u662f2560 * 1600 \u8fd9\u4e5f\u662f\u5f88\u591acompute\u7684\u8bbe\u7f6e<br>\u5bf9\u5e94shader\u5185\u90e8\u7684\u6267\u884c\u5355\u5143\u662f 8*8\uff08AMD 64 nvidia 32 \u7684\u4e00\u4e2a\u6700\u5c0f\u516c\u500d\u6570\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">shared memory<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u5bf9\u4e8e 8*8 \u7684workgroup\uff0c\u5212\u5206\u4e86  groupshared float Shared[400]\uff0c\u7528\u4e8e\u4e24\u4e2a\u7528\u9014<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7b2c\u4e00\u6b21\uff1a\u4fdd\u5b5812\u00d712\u6df1\u5ea6Tile\uff0c\u4e5f\u5c31\u662f2\u50cf\u7d20\u8fb9\u6846\uff1a144 * float                      <\/li>\n\n\n\n<li>\u7b2c\u4e8c\u6b21\uff1a\u4fdd\u5b5810\u00d710\u5f53\u524d\u989c\u8272Tile\uff0c1\u50cf\u7d20\u8fb9\u6846\uff1a    100 * 4 * float<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u52a0\u8f7d12\u00d712\u6df1\u5ea6<br>\u2193 Barrier<br>\u6240\u6709\u7ebf\u7a0b\u4f7f\u7528\u6df1\u5ea6<br>\u2193 Barrier<br>\u8986\u76d6\u621010\u00d710\u989c\u8272<br>\u2193 Barrier<br>\u6240\u6709\u7ebf\u7a0b\u4f7f\u7528\u989c\u8272<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7\u4e09\u6b21Group Barrier\uff0c\u4fdd\u8bc1\u6267\u884c\u987a\u5e8f\uff0c\u540c\u4e00\u5757\u5185\u5b58\u53ef\u4ee5\u7528\u6765\u505a\u4e24\u4ef6\u4e8b<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. depth<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">TAA\u8fc7\u7a0b\u4e3a\u4ec0\u4e48\u9700\u8981\u6df1\u5ea6\uff1f\u8fd8\u662f\u542b\u67092\u50cf\u7d20\u8fb9\u6846\u7684\u6df1\u5ea6\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TLDR<\/strong>\uff1a\u4e3a\u4e86\u9632\u6b62\u7269\u4f53\u8f6e\u5ed3\u9644\u8fd1\u201c\u5f53\u524d\u50cf\u7d20\u4e3a\u80cc\u666f\uff0c\u4f46motion vector\u4e3a\u4eba\u7269\u8fd0\u52a8\u201d\u7684\u60c5\u51b5\uff0c\u5bfc\u81f4\u4eba\u7269\u8fd0\u52a8\u65f6\u8f6e\u5ed3\u62d6\u5f71<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5177\u4f53\u505a\u6cd5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1. \u91c7\u68375\u6b21 (-2,-2)  (+2,-2) (0,0) (-2,+2) (+2,+2) depth\uff0c\u5bf9\u5e942\u50cf\u7d20 depth \u8fb9\u6846<\/li>\n\n\n\n<li>2. \u53d6\u6700\u5927\u503c\uff08reverse Z\u4e2d\uff0c\u6df1\u5ea6\u8d8a\u5927\u4ee3\u8868\u8d8a\u9760\u8fd1\u955c\u5934\uff0c\u5373\u8d8a\u53ef\u80fd\u662f\u4eba\u7269\u800c\u975e\u80cc\u666f\uff09<\/li>\n\n\n\n<li>3. \u8bb0\u5f55\u8fd9\u4e2a\u504f\u79fb\u503c\uff0c\u7528\u4e8e\u91c7\u6837motion vector<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. Current Color<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">TAA\u8fc7\u7a0b\u4e2d\uff0c\u5f53\u524d\u989c\u8272tile\u7684\u52a0\u8f7d\u6d41\u7a0b\uff08\u6ce8\u610f\u662f<strong>\u5f53\u524d<\/strong>\uff0c\u800c\u975e<strong>\u5386\u53f2<\/strong>\uff0c\u5728\u4f7f\u7528shared memory\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ebf\u7a0b\u5206\u5de5\uff1a\u524d64\u4e2a\u6bcf\u4e2a load 1\u50cf\u7d20\uff0c\u7136\u540e\u524d36\u4e2a\u989d\u5916load \u4e00\u4e2a <code>index+64<\/code> \u6837\u672c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">YCoCg\u7c7b\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float Y  = R + 2*G + B;\nfloat Co = 2*R - 2*B;\nfloat Cg = -R + 2*G - B;\nfloat InvLumaWeight =\n    1.0 \/ (Y * Exposure + 4.0);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u6837\u4e5f\u662f\u4e00\u4e2a\u50cf\u7d20\u5bf9\u5e944\u4e2afloat\uff0c\u5b9e\u9645shared memory \u5b58\u50a8\u7684\u662f\u8fd9\u4e2a\uff0c\u800c\u4e0d\u662fRGBA<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5341\u5b57\u5f62\u8bfb\u53d6\uff1a\u6bcf\u4e2a\u8f93\u51fa\u7ebf\u7a0b\u8bfb\u53d6\u4e0a\u4e0b\u5de6\u53f3 + \u672c\u4f53\u4e00\u51715\u4e2a\u4f4d\u7f6e\u7684\u6570\u636e\uff0c\u7528\u4e8eclamp <strong>\u5386\u53f2\u5e27<\/strong>\uff0c\u9632\u6b62\u5386\u53f2\u5e27\u7684\u50cf\u7d20\u4e0e\u5f53\u524d\u5e27\u5dee\u8ddd\u5f88\u5927\uff0c\u5e94\u8be5\u88ab\u5e9f\u5f03\u7684\u60c5\u51b5\u88ab\u6df7\u5408\u8fdb\u6765\u3002\u4f46\u662f\u9884\u6ee4\u6ce2\u529f\u80fd\u88ab\u5e38\u91cf\u914d\u7f6e\u5173\u6389\u4e86\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u524d\u5341\u5b57\u91c7\u6837\u4e2d\uff0c\u6700\u540e\u4ec5\u4fdd\u7559\u4e2d\u5fc3\u50cf\u7d20\u4e3a\u6700\u540e\u7684\u989c\u8272\u5408\u6210\u6837\u672c\uff0c\u5176\u4ed6\u4e0d\u53c2\u4e0e\u989c\u8272\u5408\u6210\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. History Color<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">History Color\u9762\u5bf9\u7684\u95ee\u9898\uff1asample UV\u6765\u81ea\u4e8emotion vector\u91cd\u5efa\uff0c\u6ce8\u5b9a\u4e0d\u662f\uff080.5\uff0c0.5\uff09\u8fd9\u6837\u7684\u89c4\u6574\u60c5\u51b5\uff0c\u56e0\u6b64\u9700\u8981\u591a\u91c7\u6837\u6df7\u5408\u3002\u8fd9\u91cc\u4ecd\u7136\u662f\u7528\u5341\u5b57\u91c7\u6837\u65b9\u6848\uff0c\u91c7\u68375\u6b21\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7279\u6b8a\u7684\u662f\uff0c\u8fd9\u91cc\u4e0d\u662f\u53cc\u7ebf\u6027\u6df7\u5408\uff0c\u800c\u662fCatmull-Rom \u91cd\u5efa\uff0c\u6bcf\u4e2a\u6837\u672c\u7684\u4f4d\u7f6e\u548c\u6743\u91cd\u90fd\u7531\u4e09\u6b21\u63d2\u503c\u7cfb\u6570\u51b3\u5b9a\uff0c\u56e0\u6b64\u901a\u5e38\u6bd4\u666e\u901a\u53cc\u7ebf\u6027\u91c7\u6837\u66f4\u6e05\u6670\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u91c7\u6837\u540e\uff0c\u5c06\u5386\u53f2 RGB \u8f6c\u4e3a YCoCg-like \u7a7a\u95f4\uff0c\u7136\u540eclamp<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. blend factor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">history\u548ccurrent pixel\u5728\u6df7\u5408\u65f6\u7684\u6743\u91cd\uff0c\u4f1a\u53d7\u5230motion vector\u548c\u4e24\u8005\u989c\u8272\u5dee\u5f02\u7684\u5f71\u54cd<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u524d\u57fa\u7840 currentWeight = 0.25; historyWeight = 0.75\uff1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>motionWeight =\n    lerp(0.25, 0.20, saturate(motionLengthPixels * 0.025));\n\ncolorWeight =\n    saturate(historyY * 0.01 \/\n             abs(currentY - historyY));\n\ncurrentWeight = max(motionWeight, colorWeight);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y\u662fR + 2*G + B\uff0c\u4ee3\u8868\u4eae\u5ea6<\/li>\n\n\n\n<li>\u8fd0\u52a8\u8fbe\u5230\u7ea6 40 \u50cf\u7d20\u65f6\uff0c<code>motionWeight<\/code> \u4ece <code>0.25<\/code> \u964d\u81f3 <code>0.20<\/code>\uff0c\u52a8\u7684\u8d8a\u5feb\uff0c\u8d8a\u503e\u5411\u5386\u53f2\u5e27<\/li>\n\n\n\n<li>\u4eae\u5ea6\u8d8a\u63a5\u8fd1\uff0ccurrentWeight\u8d8a\u63a5\u8fd11\uff0c\u5373\u4e0d\u9700\u8981blend<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u7ec8blend\u6743\u91cd\u4e5f\u4e0e\u4eae\u5ea6Y\u6709\u5173\uff0c\u901a\u8fc7\u964d\u4f4e\u8fc7\u4eae\u50cf\u7d20\u7684\u6743\u91cd\uff0c\u9632\u6b62\u5f02\u5e38\u4eae\u503c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Wh = (1-currentWeight) \/ (historyY + 4);\nWc = currentWeight     \/ (currentY + 4);\n\nresult = (history*Wh + current*Wc) \/ (Wh+Wc);<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. MotionBlur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Compute Pass #3\uff0c\u7d27\u63a5\u7740TAA\u7684\uff0c\u662f\u4e00\u4e2a\u7528\u4e8e\u8fd0\u52a8\u6a21\u7cca Motion Blur\u7684 Texture \u51c6\u5907\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5206\u8bb0\u5f55\u4e0b\u6765\u7684R11G11B10\u683c\u5f0f\u4e3a\uff1a\uff08\u901f\u5ea6\u957f\u5ea6\uff0c\u7f16\u7801\u65b9\u5411\uff0c\u6df1\u5ea6\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u56fe\uff0c\u89d2\u8272\u90e8\u5206\u7684\u901f\u5ea6\u957f\u5ea6\u4e3a0\uff0c\u7f16\u7801\u65b9\u5411\u4e3a0.5\uff08angle = 0\uff09\uff0c\u6df1\u5ea6\u4e3a\u7ebf\u6027\u5316\u540e\u7684\u4e00\u4e2a150-200\u5de6\u53f3\u7684\u503c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u663e\u7136\uff0c\u5728\u4e0d\u52a8\u7684\u60c5\u51b5\u4e0b\uff0c\u5f53\u524d\u662fmotionblur\u662f\u6ca1\u4ec0\u4e48\u7528\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u80cc\u666f\u90e8\u5206\u53ef\u80fd\u7531\u4e8e\u6d6e\u70b9\u6570\u95ee\u9898\u6709\u6ce2\u52a8\uff0c\u4f46\u4e0d\u91cd\u8981<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-29-1024x640.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" data-original=\"https:\/\/ferina.top\/wp-content\/uploads\/2026\/07\/image-29-1024x640.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-2195\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Bloom <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148\u539f\u753b\u5e45 2560 * 1600 \u964d\u91c7\u6837\u5230 640 400\uff08L0\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L0\u4eae\u5ea6\u63d0\u53d6\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ 0.20\t 0\n\/\/ 0.35\t 0\n\/\/ 0.50\t 0.65\u00d70.15 = 0.0975\n\/\/ 1.00\t 0.65\u00d70.65 = 0.4225\n\/\/ 2.00\t 0.65\u00d71.65 = 1.0725\nfloat3 bloomSeed = max(rgb - 0.35, 0.0) * 0.65;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6ce8\u610f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u539f\u7eb9\u7406\u662fR11G11B10\u7684HDR\uff0c\u56e0\u6b64rgb\u662f\u53ef\u4ee5\u5927\u4e8e1\u7684\uff08\u4f46\u5b9e\u9645\u4e0a\u53ea\u6709\u5c11\u91cf\u4eae\u6591\u8d85\u8fc7\u4e861\uff09<\/li>\n\n\n\n<li>\u4eae\u90e8\u63d0\u53d6\u4f7f\u7528\u4e86\u6df1\u5ea6\u7eb9\u7406\uff0c\u4f46\u8fd9\u91cc\u8ddd\u79bbfactor\u5b9e\u9645\u88ab\u5173\u6389\u4e86\uff0c\u56e0\u6b64\u5f62\u5f0f\u5316\u7b80\u5f97\u975e\u5e38\u597d\u770b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u8fde\u7eed\u964d\u91c7\u6837\uff0c\u751f\u6210\u5bf9\u5e94\u76844\u7ea7\u7eb9\u7406\u96c6\u5408\uff1a L0 640 400 | L1 320 200 | L2 160 100 | L3 80 50<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u6bcf\u5c42\u8fdb\u884c\u72ec\u7acb\u7684\u9ad8\u65af\u6a21\u7cca\uff0c\u6a2a\u5411\u548c\u7eb5\u5411\u4e24\u6b21gaussian blur\u6765cosplay 2D gaussian<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L0 L1 \u7528\u7684\u662f\u534a\u5f84 8 texel\u7684\u5c0f\u6838\uff08sample = 9\uff09\uff1bL2\u7528\u7684\u662f\u534a\u5f84 15 texels\u7684\u4e2d\u6838\uff08sample = 16\uff09\uff1bL3\u7528\u7684\u662f\u534a\u5f84 19 texels\uff08sample = 20\uff09 \u7684\u5927\u6838\u3002\u5177\u4f53\u6570\u503c\u548c\u6743\u91cd\u90fd\u662f\u786c\u7f16\u7801\u7684\u5e38\u91cf\u3002\u8d8a\u4f4e\u5206\u8fa8\u7387\u8d8a\u7528\u5927\u6838\uff0c\u8ba9\u4f4e\u9891\u91cf\u6269\u6563\u5230\u66f4\u5e7f\u5f97\u8303\u56f4\uff0c\u6a21\u62df\u5927\u8303\u56f4\u7684\u5149\u6655\u3002 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u540e0.3 L0 + 0.1 L1 + 0.2 L2 + 0.2 L3 \u53e0\u52a0\u4e3a\u4e00\u4e2a640 480\u7684\u7eb9\u7406\uff0c\u964d\u4e86\u4e00\u90e8\u5206\u80fd\u91cf\uff0c\u548c\u4e0d\u4e3a1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u600e\u4e48\u52a0\uff1a\u5bf9\u4e8e640 400\u7684texture\u7684uv\uff0c\u76f4\u63a5\u5bf9\u4e0d\u540c\u5c42\u7684\u7eb9\u7406\u91c7\u6837\u5f97\u7ed3\u679c\u3002\u5bf9\u4e8e\u4f4e\u5206\u8fa8\u7387\u7684\u56fe\u50cf\uff0c\u8fd9\u91cc\u76f4\u63a5\u5f97\u5230\u53cc\u7ebf\u6027\u63d2\u503c\u7684\u7ed3\u679c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PS\uff1a\u8fd9\u4e2a\u6d41\u7a0b\u4e2d\uff0c\u7528\u4e86\u591a\u6b21ClearRenderTargetView\u6765\u8282\u7701\u4e00\u5b9a\u7684\u5185\u5b58<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Final<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Skeleton Vertex Motion vector<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e4b\u524d\u4e00\u76f4\u5f88\u597d\u5947\u7684\u70b9\u662f\uff0c\u9aa8\u9abc\u6a21\u578b\u5728shader\u5c42\u7ea7\u7684\u7ed3\u6784\u662f\u600e\u6837\u7684\u3002\u8fd9\u6b21\u5728\u8ffd\u6eafmotion vector\u6765\u6e90\u7684\u65f6\u5019\uff0c\u6b63\u597d\u628a\u8fd9\u90e8\u5206\u7684\u7ed3\u6784\u6574\u7406\u4e00\u4e0b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u9aa8\u9abc\u77e9\u9635\u4e0e\u9876\u70b9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9996\u5148\uff1a\u9aa8\u9abc\u662fmodel\u5c42\u7ea7\u7684\u6982\u5ff5\uff0c\u5bf9\u4e8e\u76ee\u524d\u7684face cloth weapon fur\u8fd9\u4e9b\u6a21\u578b\uff0c\u5404\u81ea\u5177\u6709\u4ece1\uff08eye\uff09\u5230102\uff08up\uff09\u4e0d\u7b49\u7684bone\u6570\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bcf\u6839\u9aa8\u9abc\u662f\u4e00\u4e2a 3\u00d74 \u77e9\u9635\uff1a3\u00d73 \u4fdd\u5b58\u65cb\u8f6c\u3001\u7f29\u653e\uff0c\u6700\u540e\u4e00\u5217\u4fdd\u5b58\u5e73\u79fb\uff1b4\u00d74 \u77e9\u9635\u56fa\u5b9a\u7684\u6700\u540e\u4e00\u884c (0,0,0,1) \u88ab\u7701\u7565\u3002\u6bcf\u6839\u9aa8\u9abc\u5360 3\u00d7float4=48 B\u3002shader \u5b9a\u4e49 float4[3][256]\uff0c\u56e0\u6b64\u6bcf\u4e2amodel\u6700\u591a\u6709256\u6839bones\u3002<\/p>\n\n\n\n<details>\n<summary><strong>\u6a21\u578b\u9aa8\u9abc\u6570\u5177\u4f53\u6570\u636e<\/strong><\/summary>\n<table>\n<thead><tr><th>\u6a21\u578b<\/th><th>\u552f\u4e00\u9876\u70b9<\/th><th>\u5b9e\u9645\u9aa8\u9abc\u77e9\u9635<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>face01<\/td><td>3,004<\/td><td>21<\/td><\/tr>\n<tr><td>cloth<\/td><td>22,444<\/td><td>95<\/td><\/tr>\n<tr><td>wand<\/td><td>20,901<\/td><td>45<\/td><\/tr>\n<tr><td>eye1<\/td><td>396<\/td><td>1<\/td><\/tr>\n<tr><td>fur<\/td><td>8,629<\/td><td>13<\/td><\/tr>\n<tr><td>down01<\/td><td>14,435<\/td><td>65<\/td><\/tr>\n<tr><td>face<\/td><td>3,004<\/td><td>21<\/td><\/tr>\n<tr><td>bangs<\/td><td>6,119<\/td><td>42<\/td><\/tr>\n<tr><td>hair01<\/td><td>12,131<\/td><td>30<\/td><\/tr>\n<tr><td>wand-baoshi<\/td><td>905<\/td><td>4<\/td><\/tr>\n<tr><td>up01<\/td><td>13,089<\/td><td>102<\/td><\/tr>\n<\/tbody>\n<\/table>\n<\/details>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e76\u4e0d\u662f\u9aa8\u9abc\u4fdd\u5b58\u9876\u70b9\uff0c\u800c\u662f\u9876\u70b9\u4fdd\u5b58\u201c<strong>\u5f71\u54cd\u8fd9\u4e2a\u9876\u70b9\u7684\u9aa8\u9abc\u7f16\u53f7\u4ee5\u53ca\u6743\u91cd<\/strong>\u201d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bcf\u4e2a\u9876\u70b9\u4fdd\u5b58 bone index \u548c bone weight\uff1aATTRIBUTE3\u3001ATTRIBUTE14 \u63d0\u4f9b<strong>\u6700\u591a 8 \u4e2a<\/strong>\u9aa8\u9abc\u7f16\u53f7\uff0cATTRIBUTE4\u3001ATTRIBUTE15 \u63d0\u4f9b\u5bf9\u5e94\u7684 <strong>8 \u4e2a\u6743\u91cd<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bone index \u548c weight \u6765\u81ea vertex buffer\uff0c\u4e0d\u662f constant buffer\uff1b\u5b83\u4eec\u901a\u5e38\u662f\u56fa\u5b9a\u7684\u6a21\u578b\u6570\u636e\u3002\u6bcf\u5e27\u66f4\u65b0\u7684\u662f\u9aa8\u9abc\u77e9\u9635 palette\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u8499\u76ae<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5904\u7406\u4e00\u4e2a\u9876\u70b9\u7684\u65f6\u5019\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7MVP\u53d8\u6362\uff0c\u628a\u6a21\u578b\u9876\u70b9\u4f4d\u7f6e\u53d8\u6362\u5230\u6295\u5f71\u7a7a\u95f4\u3002\u800c\u9aa8\u9abc\u77e9\u9635\u7684\u5f71\u54cd\u5728\u8fd9\u4e4b\u524d\uff0c\u76f8\u5f53\u4e8e\u76f4\u63a5\u6539\u53d8\u4e86model\u7684\u5f62\u72b6\uff0c\u5177\u4f53\u516c\u5f0f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nSkinnedPosition =\n    weight0 * Transform(Bones&#91;index0], localPosition) +\n    weight1 * Transform(Bones&#91;index1], localPosition) + ...;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f Linear Blend Skinning\u3002\u5f97\u5230\u5f53\u524d\u8499\u76ae\u4f4d\u7f6e\u7136\u540e\u52a0\u5165\u6a21\u578b\u3001\u76f8\u673a\u548c\u6295\u5f71\u53d8\u6362\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>currentClip  = CurrentViewProjection\n             * CurrentLocalToWorld * SkinnedPosition;\n\nSV_Position       = currentClip;\n\n\/\/ \u9f50\u6b21\u7a7a\u95f4\u5f52\u4e00\u5316\u5728PS\u4e2d\u5b8c\u6210\ncurrentNDC  = currentClip.xy \/ currentClip.w;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Motion Vector<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ece\u4e0a\u9762\u7684\u63cf\u8ff0\uff0c\u53ef\u4ee5\u770b\u51fa\uff0c\u9876\u70b9\u7684\u4f4d\u7f6e\u5b9e\u9645\u6765\u6e90\u4e8e<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e00\u7ec4\u9aa8\u9abc\u53d8\u6362\u77e9\u9635\uff0c\u4e0a\u9650float4[3][256]<\/li>\n\n\n\n<li>VP\u53d8\u6362\u77e9\u9635\uff0c\u548cModel\u77e9\u9635<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u6b64\uff0cMotion Vector\u4f5c\u4e3a\u4ee3\u8868\u201c\u524d\u540e\u4e24\u5e27\u4e4b\u95f4\uff0c\u67d0\u4e2a\u5bf9\u5e94\u50cf\u7d20\u7684\u79fb\u52a8\u8d8b\u52bf\u201d\u7684\u503c\uff0c\u8003\u8651\u5230PS\u4e2d\u7684\u4e00\u4e2a\u50cf\u7d20\uff0c\u6765\u81ea\u4e8eVS\u4e2d\u7684\u9876\u70b9\u4f4d\u7f6e\u63d2\u503c\uff0c\u56e0\u6b64\u5b9e\u9645\u9700\u8981\u5b58\u50a8\u7684\u5386\u53f2\u503c\uff0c\u4e5f\u5c31\u662f\u4e0a\u9762\u8fd9\u4e9b\u3002Motion Vector\u7684\u8ba1\u7b97\u516c\u5f0f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>currentClip  = CurrentViewProjection\n             * CurrentLocalToWorld * SkinnedPosition;\npreviousClip = PreviousViewProjection\n             * PreviousLocalToWorld * PreviousSkinnedPosition;\n\nSV_Position       = currentClip;\nVELOCITY_PREV_POS = previousClip;\n\ncurrentNDC  = currentClip.xy \/ currentClip.w;\npreviousNDC = previousClip.xy \/ previousClip.w;\nmotionVector = currentNDC - previousNDC;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7279\u6b8a\u60c5\u51b5\uff1a\u5e03\u6599\u3001\u5934\u53d1\u7b49 WPO \u52a8\u753b\u8fd8\u5fc5\u987b\u4f7f\u7528\u4e0a\u4e00\u5e27\u7684\u98ce\u6216\u6750\u8d28\u53c2\u6570 <strong>TODO<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u514d\u8d23\u58f0\u660e\uff1a\u672c\u6b21\u622a\u5e27\u5206\u6790\u57fa\u4e8ewuthering waves \u7684 runtime frame\u5206\u6790\u3002\u4f18\u5148\u5206\u6790\u89d2\u8272sh [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[36,18,32],"class_list":["post-1771","post","type-post","status-publish","format-standard","hentry","category-35","tag-npr","tag-ue","tag-32"],"_links":{"self":[{"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/posts\/1771","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/comments?post=1771"}],"version-history":[{"count":261,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/posts\/1771\/revisions"}],"predecessor-version":[{"id":2262,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/posts\/1771\/revisions\/2262"}],"wp:attachment":[{"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/media?parent=1771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/categories?post=1771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ferina.top\/index.php\/wp-json\/wp\/v2\/tags?post=1771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}