{"id":991,"date":"2024-02-01T18:20:13","date_gmt":"2024-02-01T10:20:13","guid":{"rendered":"http:\/\/meecarlo.com\/?p=991"},"modified":"2024-02-01T18:20:13","modified_gmt":"2024-02-01T10:20:13","slug":"custom-shading-model-in-ue5-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%85%89%e7%85%a7%e6%a8%a1%e5%9e%8b","status":"publish","type":"post","link":"https:\/\/meecarlo.com\/old\/2024\/02\/01\/custom-shading-model-in-ue5-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%85%89%e7%85%a7%e6%a8%a1%e5%9e%8b\/","title":{"rendered":"Custom Shading Model In UE5\/\u81ea\u5b9a\u4e49\u5149\u7167\u6a21\u578b"},"content":{"rendered":"\n<p>\u6700\u8fd1\u5728\u5377UE5\u7684\u81ea\u5b9a\u4e49\u5149\u7167\u6a21\u578b\uff0c\u6240\u4ee5\u5c31\u5199\u4e00\u4e2a\u7b14\u8bb0\uff0c\u8bb0\u5f55\u4e00\u4e0b\/Recently, I&#8217;ve been experimenting with custom shading models in Unreal Engine 5 (UE5), so I decided to write some notes to keep track of my progress.<\/p>\n\n\n\n<p>\u5206\u4e09\u4e2a\u6a21\u5757\uff0c1.\u62c9\u53d6\u6e90\u4ee3\u7801\uff0c2.C++\u90e8\u5206\u6dfb\u52a0custom shading model\uff0c3.shader \u90e8\u5206\/Divide it into three modules: 1. Fetching the source code, 2. Adding the custom shading model in C++, 3. Working on the shader part.<\/p>\n\n\n\n<p>\u4e00. \u62c9\u53d6UE\u6e90\u4ee3\u7801\/Fetching the source code<\/p>\n\n\n\n<p>\u4e3b\u8981\u6b65\u9aa4\u8fd8\u662f\u6839\u636eUE\u5b98\u65b9\u6863\u6848\u6765\u64cd\u4f5c <a href=\"https:\/\/docs.unrealengine.com\/5.3\/zh-CN\/building-unreal-engine-from-source\/\">\u4ece\u6e90\u4ee3\u7801\u6784\u5efa\u865a\u5e7b\u5f15\u64ce | \u865a\u5e7b\u5f15\u64ce\u6587\u6863 (unrealengine.com)<\/a>\/The main steps to build Unreal Engine from source code should be followed based on the official documentation provided by Unreal Engine.<\/p>\n\n\n\n<p>\u4e8c.C++\u90e8\u5206\u6dfb\u52a0Custom Shading Model\/To add a custom shading model in C++<\/p>\n\n\n\n<p>\u9996\u5148\u6211\u4eec\u5f97\u5148\u8ba9UE\u77e5\u9053\u6211\u4eec\u6709\u4e00\u5957\u65b0\u7684Shading Model\uff0c\u80fd\u591f\u5728\u5149\u7167\u6a21\u578b\u7684\u4e0b\u62c9\u83dc\u5355\u4e2d\u627e\u5230\u6211\u4eec\u7684custom shading model\uff0c\u6240\u4ee5\u6211\u4eec\u5148\u4fee\u6539EngineTypes.h\u8ddfMaterialShader.cpp\u8fd9\u4e24\u4e2a\u6587\u4ef6\uff0c\u672c\u8d28\u662f\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u679a\u4e3e\/<\/p>\n\n\n\n<p>To make Unreal Engine aware of your custom shading model and have it appear in the dropdown menu of the lighting model, you need to modify the\u00a0<code>EngineTypes.h<\/code>\u00a0and\u00a0<code>MaterialShader.cpp<\/code>\u00a0files. The essence of this modification is to add a new enumeration.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"674\" height=\"387\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image.png\" alt=\"\" class=\"wp-image-993\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image.png 674w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-300x172.png 300w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><figcaption class=\"wp-element-caption\">EngineTypes.h\u7684\u5934\u6587\u4ef6\u4e2d\uff0c\u5728EMaterialShadingModel\u4e2d\u6dfb\u52a0\u6211\u4eecCustonShadingModel<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"779\" height=\"460\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-1.png\" alt=\"\" class=\"wp-image-994\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-1.png 779w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-1-300x177.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-1-768x454.png 768w\" sizes=\"auto, (max-width: 779px) 100vw, 779px\" \/><figcaption class=\"wp-element-caption\">\u5728MaterialShader.cpp\u6587\u4ef6\u4e2d\uff0c\u5728GetShadingModelString(EMaterialShadingModel ShadingModel)\u4e2d\u6dfb\u52a0<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u7ed9shader\u6dfb\u52a0\u4e00\u4e2a\u5b8f\uff0c\u8ba9shader\u8d70\u65b0\u7684\u5206\u652f<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"832\" height=\"308\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-2.png\" alt=\"\" class=\"wp-image-995\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-2.png 832w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-2-300x111.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-2-768x284.png 768w\" sizes=\"auto, (max-width: 832px) 100vw, 832px\" \/><figcaption class=\"wp-element-caption\">HLSLMaterialTranslator.cpp<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u4e3a\u4e86\u4e4b\u540e\u7684Shader\u64cd\u4f5c\uff0c\u6211\u4eec\u9700\u8981\u7ed9\u6211\u4eec\u7684shader\u5f00\u653e\u4e24\u4e2aCustomData\u7aef\u53e3\uff0c\u5206\u522b\u5728Material.cpp\u8ddfMaterialAttributeDefinitionMap.cpp\u6587\u4ef6<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"412\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-3-1024x412.png\" alt=\"\" class=\"wp-image-996\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-3-1024x412.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-3-300x121.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-3-768x309.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-3.png 1095w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Material.cpp\u4e2d\u5728\u4e24\u4e2aCustomdata\u4e2d\u589e\u52a0\u6211\u4eec\u7684ShadingModel\u7684\u540d\u79f0<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"298\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-4.png\" alt=\"\" class=\"wp-image-997\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-4.png 935w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-4-300x96.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-4-768x245.png 768w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><figcaption class=\"wp-element-caption\">\u5728MaterialAttributeDefinitionMap.cpp\u589e\u52a0\u4e24\u4e2a\u5b9a\u4e49<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u63a5\u7740\u6211\u4eec\u8ba9\u65b0\u7684ShadingModel\u5199\u5165GBuffer\uff0c\u8fd9\u91cc\u6211\u4eec\u9700\u8981\u4fee\u6539\u4e24\u4e2a\u6587\u4ef6ShaderMaterial.h\u8ddfShaderMaterialDerivedHelpers.cpp<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"727\" height=\"356\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-5.png\" alt=\"\" class=\"wp-image-998\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-5.png 727w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-5-300x147.png 300w\" sizes=\"auto, (max-width: 727px) 100vw, 727px\" \/><figcaption class=\"wp-element-caption\">\u5728ShaderMaterial.h\u4e2d\u6dfb\u52a0\u6211\u4eec\u7684\u5149\u7167\u6a21\u578b<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"90\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-7-1024x90.png\" alt=\"\" class=\"wp-image-1000\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-7-1024x90.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-7-300x26.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-7-768x68.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-7.png 1339w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">ShaderMaterialDerivedHelpers.cpp\u4e2d\u6dfb\u52a0<\/figcaption><\/figure>\n<\/div>\n\n<pre class=\"brush: cpp; first-line: 6; title: ; notranslate\" title=\"\">\nDst.WRITES_CUSTOMDATA_TO_GBUFFER = (Dst.USES_GBUFFER &amp;amp;&amp;amp; (Mat.MATERIAL_SHADINGMODEL_SUBSURFACE || Mat.MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || Mat.MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || Mat.MATERIAL_SHADINGMODEL_CLEAR_COAT || Mat.MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE || Mat.MATERIAL_SHADINGMODEL_HAIR || Mat.MATERIAL_SHADINGMODEL_CLOTH || Mat.MATERIAL_SHADINGMODEL_EYE || Mat.MATERIAL_SHADINGMODEL_TOON));\n<\/pre>\n\n\n<p>\u63a5\u7740\u6211\u4eec\u5728ShaderGenerationUtil.cpp\u4e2d\u6dfb\u52a0\u751f\u6210<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"388\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-8.png\" alt=\"\" class=\"wp-image-1001\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-8.png 722w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-8-300x161.png 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"968\" height=\"249\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-9.png\" alt=\"\" class=\"wp-image-1002\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-9.png 968w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-9-300x77.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-9-768x198.png 768w\" sizes=\"auto, (max-width: 968px) 100vw, 968px\" \/><\/figure>\n<\/div>\n\n\n<p>\u81f3\u6b64\u6211\u4eec\u7684C++\u90e8\u5206\u4fee\u6539\u5df2\u7ecf\u5b8c\u6210\uff0c\u603b\u7684\u6765\u8bf4\u6ca1\u4ec0\u4e48\u96be\u5ea6\uff0c\u57fa\u672c\u5c31\u662f\u7167\u846b\u82a6\u753b\u74e2\uff0c\u6211\u4eec\u7f16\u8bd1\u4e00\u4e0b\u770b\u770b\u5f15\u64ce<\/p>\n\n\n\n<p>At this point, we have completed the modifications in the C++ part. Overall, it wasn&#8217;t difficult; it was mostly a matter of following a similar pattern. Let&#8217;s compile the engine now to see if our changes are successful.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"923\" height=\"919\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-11.png\" alt=\"\" class=\"wp-image-1004\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-11.png 923w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-11-300x300.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-11-150x150.png 150w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-11-768x765.png 768w\" sizes=\"auto, (max-width: 923px) 100vw, 923px\" \/><figcaption class=\"wp-element-caption\">\u770b\u5230\u8fd9\u51e0\u4e2a\u5c31\u76f8\u5f53\u4e8e\u6dfb\u52a0\u6210\u529f\u4e86<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u63a5\u7740\u6211\u4eec\u5f00\u59cb\u4fee\u6539shader\u90e8\u5206<\/p>\n\n\n\n<p>Let&#8217;s continue with the modification of the shader part.<\/p>\n\n\n\n<p>\u9996\u5148\u5728ShadingCommon.ush\u4e2d\u6dfb\u52a0custom Shading Model\u7684\u5b8f\u5b9a\u4e49\uff0c\u987a\u5e8f\u8981\u548c\u4e4b\u524dC++\u4e2d\u7684\u4fdd\u6301\u4e00\u81f4\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"710\" height=\"64\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-12.png\" alt=\"\" class=\"wp-image-1005\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-12.png 710w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-12-300x27.png 300w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><figcaption class=\"wp-element-caption\">\u6211\u4eec\u4e00\u5f00\u59cb\u5b9a\u4e49\u7684ShadingModel\u5728NUM\u4e4b\u524d\uff0c\u6240\u4ee5\u5728\u8fd9\u7684\u987a\u5e8f\u4e0d\u53d8\uff0c\u987a\u4fbfNUM\u7684ID\u4e5f\u4ece13\u53d8\u4e3a14<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u63a5\u7740\u6211\u4eec\u5b9a\u4e49\u4e00\u4e0bdebug view\u4e0b\u7684ShadingModel\u7684\u989c\u8272<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"416\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-13.png\" alt=\"\" class=\"wp-image-1006\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-13.png 989w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-13-300x126.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-13-768x323.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><figcaption class=\"wp-element-caption\">\u4f9d\u7136\u662f\u5728\u540c\u4e00\u4e2a\u6587\u4ef6\u4e2d<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u7136\u540e\u6211\u4eec\u5728Definitions.usf\u4e2d\u5b9a\u4e49\u5b8f\u7684\u9ed8\u8ba4\u503c<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"119\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-14.png\" alt=\"\" class=\"wp-image-1007\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-14.png 532w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-14-300x67.png 300w\" sizes=\"auto, (max-width: 532px) 100vw, 532px\" \/><\/figure>\n<\/div>\n\n\n<p>\u73b0\u5728\u6211\u4eec\u5728BasePassCommon.ush\u8f93\u51faGBuffer<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"56\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-15-1024x56.png\" alt=\"\" class=\"wp-image-1008\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-15-1024x56.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-15-300x16.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-15-768x42.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-15.png 1300w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u5728\u6700\u540e\u52a0\u4e0aMATERIAL_SHADINGMODEL_TOON<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u8fd9\u6b65\u4e4b\u540e\u6211\u4eec\u53ef\u4ee5\u5728Debug\u72b6\u6001\u4e0b\u770b\u89c1\u6211\u4eec\u7684ShadingModel\uff0c\u73b0\u5728\u6211\u4eec\u8f93\u51faCustomData\u5206\u522b\u4fee\u6539DeferredShadingCommon.ush\u6587\u4ef6\u4e0eShadingModelsMaterial.ush<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"681\" height=\"140\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-16.png\" alt=\"\" class=\"wp-image-1009\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-16.png 681w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-16-300x62.png 300w\" sizes=\"auto, (max-width: 681px) 100vw, 681px\" \/><figcaption class=\"wp-element-caption\">\u5728DeferredShadingCommon.ush\u6587\u4ef6\u4e2d\u589e\u52a0\u6211\u4eec\u7684\u65b0\u5efa\u7684ShadingModel\u7684ID<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"274\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-17-1024x274.png\" alt=\"\" class=\"wp-image-1010\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-17-1024x274.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-17-300x80.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-17-768x205.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-17.png 1062w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u4e0b\u9762\u5c31\u662f\u6b63\u83dc\uff0c\u6211\u4eec\u5148\u65b0\u5efa\u4e00\u4e2aush\u4e13\u95e8\u653e\u65b0\u52a0\u7684\u51fd\u6570\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"307\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-18.png\" alt=\"\" class=\"wp-image-1011\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-18.png 702w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-18-300x131.png 300w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><figcaption class=\"wp-element-caption\">\u8fd9\u4e2aush\u6587\u4ef6\u653e\u5728Engine\/Shaders\/Private\u8fd9\u4e2a\u8def\u5f84\u4e0b<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\u6211\u4eec\u4e0b\u9762\u6765\u5230Shadingmodels.ush\u8fd9\u4e2a\u6587\u4ef6\u5148include\u6211\u4eec\u521a\u624d\u521b\u5efa\u7684\u5934\u6587\u4ef6<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"409\" height=\"77\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-19.png\" alt=\"\" class=\"wp-image-1012\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-19.png 409w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-19-300x56.png 300w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><\/figure>\n<\/div>\n\n\n<p>\u63a5\u7740\u6dfb\u52a0\u7740\u8272\u7b97\u6cd5<\/p>\n\n\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\/\/Toon Shading model\nFDirectLighting ToonBxDF(FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, float NoL, FAreaLight AreaLight, FShadowTerms Shadow)\n{\n\t#if GBUFFER_HAS_TANGENT\n\t\thalf3 X = GBuffer.WorldTangent;\n\t\thalf3 Y = normalize(cross(N,X));\n\t#else\t\n\t\thalf3 X = 0;\n\t\thalf3 Y = 0;\n\t#endif\n\t\n\tBxDFContext Context;\n\tInit(Context, N, X, Y, V, L);\n\tSphereMaxNoH(Context, AreaLight.SphereSinAlpha, true);\n\tContext.NoV = saturate(abs(Context.NoV) + 1e-5);\n\t\n\tfloat SpecularOffset = 0.5;\n\tfloat SpecularRange = GBuffer.CustomData.x;\n\t\n\tfloat3 ShadowColor = 0;\n\tShadowColor = GBuffer.DiffuseColor * ShadowColor;\n\tfloat offset = GBuffer.CustomData.y;\n\tfloat SoftScatterStrength = 0;\n\t\n\toffset = offset * 2 - 1;\n\thalf3 H = normalize(V + L);\n\tfloat NoH = saturate(dot(N, H));\n\tNoL = (dot(N, L) + 1) \/ 2; \/\/ overwrite NoL to get more range out of it\n\thalf NoLOffset = saturate(NoL + offset);\n\t\n\tFDirectLighting Lighting;\n\tLighting.Diffuse = AreaLight.FalloffColor * (smoothstep(0, 1, NoLOffset) * Falloff) * Diffuse_Lambert(GBuffer.DiffuseColor) * 2.2;\n\t\n\tfloat InScatter = pow(saturate(dot(L, -V)), 12) * lerp(3, .1f, 1);\n\tfloat NormalContribution = saturate(dot(N, H));\n\tfloat BackScatter = GBuffer.GBufferAO * NormalContribution \/ (PI * 2);\n\t\n\tLighting.Specular = ToonStep(SpecularRange, (saturate(D_GGX(SpecularOffset, NoH)))) * (AreaLight.FalloffColor * GBuffer.SpecularColor * Falloff * 8);\n\n\tfloat3 TransmissionSoft = AreaLight.FalloffColor * (Falloff * lerp(BackScatter, 1, InScatter)) * ShadowColor * SoftScatterStrength;\n\tfloat3 ShadowLightener = (saturate(smoothstep(0, 1, saturate(1 - NoLOffset))) * ShadowColor * 0.1);\n\t\n\tLighting.Transmission = (ShadowLightener + TransmissionSoft) * Falloff;\n\t\n\treturn Lighting;\n\t\n}\n<\/pre>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"581\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-20-1024x581.png\" alt=\"\" class=\"wp-image-1013\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-20-1024x581.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-20-300x170.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-20-768x436.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-20.png 1314w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n\n\t\t\tfloat3 Attenuation = 1;\n\t\t\tBRANCH\n\n\t\t\tif (GBuffer.ShadingModelID == SHADINGMODELID_TOON)\n\t\t\t{\n\t\t\t\tfloat offset = GBuffer.CustomData.y;\n\t\t\t\tfloat TerminatorRange = saturate(GBuffer.Roughness - 0.5);\n\t\t\t\t\n\t\t\t\toffset = offset * 2 - 1;\n\t\t\t\t\n\t\t\t\tBRANCH\n\n\t\t\t\tif (offset &gt;= 1)\n\t\t\t\t{\n\t\t\t\t\tAttenuation = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfloat NoL = (dot(N, L) + 1) \/ 2;\n\t\t\t\t\tfloat NoLOffset = saturate(NoL + offset);\n\t\t\t\t\tfloat LightAttenuationOffset = saturate(Shadow.SurfaceShadow + offset);\n\t\t\t\t\tfloat ToonSurfaceShadow = smoothstep(0.5 - TerminatorRange, 0.5 + TerminatorRange, LightAttenuationOffset);\n\n\t\t\t\t\tAttenuation = smoothstep(0.5 - TerminatorRange, 0.5 + TerminatorRange, NoLOffset) * ToonSurfaceShadow;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\/\/Toon Shading Model\n<\/pre>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"483\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-21-1024x483.png\" alt=\"\" class=\"wp-image-1014\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-21-1024x483.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-21-300x142.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-21-768x363.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-21.png 1127w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\u5728DefeeredLightingCommon.ush\u4e2d\u6dfb\u52a0\u4ee5\u4e0a\u4ee3\u7801\u4ee5\u53ca\u4fee\u6539\u4ee5\u4e0b\u4ee3\u7801<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"61\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-22-1024x61.png\" alt=\"\" class=\"wp-image-1015\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-22-1024x61.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-22-300x18.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-22-768x46.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-22.png 1241w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"72\" src=\"http:\/\/meecarlo.com\/wp-content\/uploads\/2024\/02\/image-23-1024x72.png\" alt=\"\" class=\"wp-image-1016\" srcset=\"https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-23-1024x72.png 1024w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-23-300x21.png 300w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-23-768x54.png 768w, https:\/\/meecarlo.com\/old\/wp-content\/uploads\/2024\/02\/image-23.png 1329w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u6700\u540e\u6211\u4eec\u91cd\u65b0\u7f16\u8bd1\u4e00\u4e0b\u770b\u4e00\u4e0b\u6548\u679c<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u5728\u5377UE5\u7684\u81ea\u5b9a\u4e49\u5149\u7167\u6a21\u578b\uff0c\u6240\u4ee5\u5c31\u5199\u4e00\u4e2a\u7b14\u8bb0\uff0c\u8bb0\u5f55\u4e00\u4e0b\/Recently, I&#8217;ve been &hellip; <a href=\"https:\/\/meecarlo.com\/old\/2024\/02\/01\/custom-shading-model-in-ue5-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%85%89%e7%85%a7%e6%a8%a1%e5%9e%8b\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">Custom Shading Model In UE5\/\u81ea\u5b9a\u4e49\u5149\u7167\u6a21\u578b<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":942,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-991","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-study-note"],"_links":{"self":[{"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/posts\/991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/comments?post=991"}],"version-history":[{"count":2,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/posts\/991\/revisions"}],"predecessor-version":[{"id":1017,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/posts\/991\/revisions\/1017"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/media\/942"}],"wp:attachment":[{"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/media?parent=991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/categories?post=991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/meecarlo.com\/old\/wp-json\/wp\/v2\/tags?post=991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}