{"id":1513,"date":"2024-05-27T23:29:56","date_gmt":"2024-05-27T14:29:56","guid":{"rendered":"https:\/\/xn--k10aa.com\/?p=1513"},"modified":"2024-10-20T21:16:31","modified_gmt":"2024-10-20T12:16:31","slug":"cs2","status":"publish","type":"post","link":"https:\/\/remoooo.com\/en\/cs2\/","title":{"rendered":"Compute Shader Learning Notes (II) Post-processing Effects"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-373.png\" alt=\"img\" class=\"wp-image-1519 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"705\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-373.png\" alt=\"img\" class=\"wp-image-1519 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-373.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-373-300x147.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-373-1024x501.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-373-768x376.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u8a00<\/h2>\n\n\n\n<p>\u521d\u6b65\u8ba4\u8bc6\u4e86Compute Shader\uff0c\u5b9e\u73b0\u4e00\u4e9b\u7b80\u5355\u7684\u6548\u679c\u3002\u6240\u6709\u7684\u4ee3\u7801\u90fd\u5728\uff1a<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learngithub.com\/Remyuu\/Unity-Compute-Shader-Learn\">https:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learngithub.com\/Remyuu\/Unity-Compute-Shader-Learn<\/a><\/p>\n\n\n\n<p>main\u5206\u652f\u662f\u521d\u59cb\u4ee3\u7801\uff0c\u53ef\u4ee5\u4e0b\u8f7d\u5b8c\u6574\u7684\u5de5\u7a0b\u8ddf\u7740\u6211\u6572\u4e00\u904d\u3002PS\uff1a\u6bcf\u4e00\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u6211\u90fd\u5355\u72ec\u5f00\u4e86\u5206\u652f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-374.png\" alt=\"img\" class=\"wp-image-1518 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"455\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-374.png\" alt=\"img\" class=\"wp-image-1518 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-374.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-374-300x95.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-374-1024x324.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-374-768x243.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u8fd9\u4e00\u7bc7\u6587\u7ae0\u5b66\u4e60\u5982\u4f55\u4f7f\u7528Compute Shader\u5236\u4f5c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u540e\u5904\u7406\u6548\u679c<\/li>\n\n\n\n<li>\u7c92\u5b50\u7cfb\u7edf<\/li>\n<\/ul>\n\n\n\n<p>\u4e0a\u4e00\u7bc7\u6587\u7ae0\u6ca1\u6709\u63d0\u53caGPU\u7684\u67b6\u6784\uff0c\u662f\u56e0\u4e3a\u6211\u89c9\u5f97\u4e00\u4e0a\u6765\u5c31\u89e3\u91ca\u4e00\u5927\u5806\u540d\u8bcd\u6839\u672c\u542c\u4e0d\u61c2QAQ\u3002\u6709\u4e86\u5b9e\u9645\u7f16\u5199Compute Shader\u7684\u7ecf\u9a8c\uff0c\u5c31\u53ef\u4ee5\u5c06\u62bd\u8c61\u7684\u6982\u5ff5\u548c\u5b9e\u9645\u7684\u4ee3\u7801\u8054\u7cfb\u8d77\u6765\u3002<\/p>\n\n\n\n<p>CUDA\u5728GPU\u4e0a\u7684<strong>\u6267\u884c\u7a0b\u5e8f<\/strong>\u53ef\u4ee5\u7528\u4e09\u5c42\u67b6\u6784\u6765\u8bf4\u660e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grid &#8211; \u5bf9\u5e94\u4e00\u4e2aKernel<\/li>\n\n\n\n<li>|-Block &#8211; \u4e00\u4e2aGrid\u6709\u591a\u4e2aBlock\uff0c\u6267\u884c\u76f8\u540c\u7684\u7a0b\u5e8f<\/li>\n\n\n\n<li>| |-Thread &#8211; GPU\u4e0a\u6700\u57fa\u672c\u7684\u8fd0\u7b97\u5355\u5143<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-369.png\" alt=\"img\" class=\"wp-image-1514 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"786\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-369.png\" alt=\"img\" class=\"wp-image-1514 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-369.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-369-300x164.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-369-1024x559.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-369-768x419.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>Thread\u662fGPU\u6700\u57fa\u7840\u7684\u5355\u5143\uff0c\u4e0d\u540cThread\u4e2d\u81ea\u7136\u5c31\u4f1a\u6709\u4fe1\u606f\u4ea4\u6362\u3002\u4e3a\u4e86\u6709\u6548\u5730\u652f\u6301\u5927\u91cf\u5e76\u884c\u7ebf\u7a0b\u7684\u8fd0\u884c\uff0c\u5e76\u89e3\u51b3\u8fd9\u4e9b\u7ebf\u7a0b\u4e4b\u95f4\u7684\u6570\u636e\u4ea4\u6362\u9700\u6c42\uff0c\u5185\u5b58\u88ab\u8bbe\u8ba1\u6210\u591a\u4e2a\u5c42\u6b21\u3002\u56e0\u6b64<strong>\u5b58\u50a8\u89d2\u5ea6<\/strong>\u4e5f\u53ef\u4ee5\u5206\u4e3a\u4e09\u5c42\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Per-Thread memory &#8211; \u4e00\u4e2aThread\u5185\uff0c\u4f20\u8f93\u5468\u671f\u662f\u4e00\u4e2a\u65f6\u949f\u5468\u671f\uff08\u5c0f\u4e8e1\u7eb3\u79d2\uff09\uff0c\u901f\u5ea6\u53ef\u4ee5\u6bd4\u5168\u5c40\u5185\u5b58\u5feb\u51e0\u767e\u500d\u3002<\/li>\n\n\n\n<li>Shared memory &#8211; \u4e00\u4e2aBlock\u4e4b\u95f4\uff0c\u901f\u5ea6\u6bd4\u5168\u5c40\u5feb\u5f88\u591a\u3002<\/li>\n\n\n\n<li>Global memory &#8211; \u6240\u6709\u7ebf\u7a0b\u4e4b\u95f4\uff0c\u4f46\u901f\u5ea6\u6700\u6162\uff0c\u901a\u5e38\u662fGPU\u7684\u74f6\u9888\u3002Volta\u67b6\u6784\u4f7f\u7528\u4e86HBM2\u4f5c\u4e3a\u8bbe\u5907\u7684\u5168\u5c40\u5185\u5b58\uff0cTuring\u5219\u662f\u7528\u4e86GDDR6\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u5982\u679c\u8d85\u8fc7\u5185\u5b58\u5927\u5c0f\u9650\u5236\uff0c\u5219\u4f1a\u88ab\u63a8\u5230\u5bb9\u91cf\u66f4\u5927\u4f46\u662f\u66f4\u6162\u7684\u5b58\u50a8\u7a7a\u95f4\u4e0a\u3002<\/p>\n\n\n\n<p>Shared Memory\u548cL1 cache\u5171\u4eab\u540c\u4e00\u4e2a\u7269\u7406\u7a7a\u95f4\uff0c\u4f46\u662f\u529f\u80fd\u4e0a\u6709\u533a\u522b\uff1a\u524d\u8005\u9700\u8981\u624b\u52a8\u7ba1\u7406\uff0c\u540e\u8005\u7531\u786c\u4ef6\u81ea\u52a8\u7ba1\u7406\u3002\u6211\u7684\u7406\u89e3\u662f\uff0cShared Memory \u529f\u80fd\u4e0a\u7c7b\u4f3c\u4e8e\u4e00\u4e2a\u53ef\u7f16\u7a0b\u7684L1\u7f13\u5b58\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-371.png\" alt=\"img\" class=\"wp-image-1516 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"851\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-371.png\" alt=\"img\" class=\"wp-image-1516 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-371.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-371-300x177.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-371-1024x605.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-371-768x454.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5728NVIDIA\u7684CUDA\u67b6\u6784\u4e2d\uff0c<strong>\u6d41\u5f0f\u591a\u5904\u7406\u5668\uff08Streaming Multiprocessor, SM\uff09<\/strong>\u662fGPU\u4e0a\u7684\u4e00\u4e2a\u5904\u7406\u5355\u5143\uff0c\u8d1f\u8d23\u6267\u884c\u5206\u914d\u7ed9\u5b83\u7684<strong>\u7ebf\u7a0b\u5757\uff08Blocks\uff09<\/strong>\u4e2d\u7684\u7ebf\u7a0b\u3002<strong>\u6d41\u5904\u7406\u5668\uff08Stream Processors\uff09<\/strong>\uff0c\u4e5f\u79f0\u4e3a\u201cCUDA\u6838\u5fc3\u201d\uff0c\u662fSM\u5185\u7684\u5904\u7406\u5143\u4ef6\uff0c\u6bcf\u4e2a\u6d41\u5904\u7406\u5668\u53ef\u4ee5\u5e76\u884c\u5904\u7406\u591a\u4e2a\u7ebf\u7a0b\u3002\u603b\u7684\u6765\u8bf4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GPU -> Multi-Processors (SMs) -> Stream Processors<\/strong><\/li>\n<\/ul>\n\n\n\n<p>\u5373\uff0cGPU\u5305\u542b\u591a\u4e2aSM\uff08\u4e5f\u5c31\u662f\u591a\u5904\u7406\u5668\uff09\uff0c\u6bcf\u4e2aSM\u5305\u542b\u591a\u4e2a\u6d41\u5904\u7406\u5668\u3002\u6bcf\u4e2a\u6d41\u5904\u7406\u5668\u8d1f\u8d23\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7ebf\u7a0b\uff08Thread\uff09\u7684\u8ba1\u7b97\u6307\u4ee4\u3002<\/p>\n\n\n\n<p>\u5728GPU\u4e2d\uff0c<strong>Thread\uff08\u7ebf\u7a0b\uff09<\/strong>\u662f\u6267\u884c\u8ba1\u7b97\u7684\u6700\u5c0f\u5355\u5143\uff0c<strong>Warp\uff08\u7eac\u5ea6\uff09<\/strong>\u662fCUDA\u4e2d\u7684\u57fa\u672c\u6267\u884c\u5355\u4f4d\u3002<\/p>\n\n\n\n<p>\u5728NVIDIA\u7684CUDA\u67b6\u6784\u4e2d\uff0c\u6bcf\u4e2a<strong>Warp<\/strong>\u901a\u5e38\u5305\u542b32\u4e2a<strong>\u7ebf\u7a0b<\/strong>\uff08AMD\u670964\u4e2a\uff09\u3002<strong>Block\uff08\u5757\uff09<\/strong>\u662f\u4e00\u4e2a\u7ebf\u7a0b\u7ec4\uff0c\u5305\u542b\u591a\u4e2a\u7ebf\u7a0b\u3002\u5728CUDA\u4e2d\uff0c\u4e00\u4e2a<strong>Block<\/strong>\u53ef\u4ee5\u5305\u542b\u591a\u4e2a<strong>Warp<\/strong>\u3002<strong>Kernel\uff08\u5185\u6838\uff09<\/strong>\u662f\u5728GPU\u4e0a\u6267\u884c\u7684\u4e00\u4e2a\u51fd\u6570\uff0c\u4f60\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u4e00\u6bb5\u7279\u5b9a\u7684\u4ee3\u7801\uff0c\u8fd9\u6bb5\u4ee3\u7801\u88ab\u6240\u6709\u6fc0\u6d3b\u7684\u7ebf\u7a0b\u5e76\u884c\u6267\u884c\u3002\u603b\u7684\u6765\u8bf4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kernel -> Grid -> Blocks -> Warps -> Threads<\/strong><\/li>\n<\/ul>\n\n\n\n<p>\u4f46\u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\uff0c\u901a\u5e38\u9700\u8981\u540c\u65f6\u6267\u884c\u7684<strong>\u7ebf\u7a0b\uff08Threads\uff09<\/strong>\u8fdc\u8d85\u8fc732\u4e2a\u3002<\/p>\n\n\n\n<p>\u4e3a\u4e86\u89e3\u51b3\u8f6f\u4ef6\u9700\u6c42\u4e0e\u786c\u4ef6\u67b6\u6784\u4e4b\u95f4\u7684\u6570\u91cf\u4e0d\u5339\u914d\u95ee\u9898\uff0cGPU\u91c7\u7528\u4e86\u4e00\u79cd\u7b56\u7565\uff1a\u5c06\u5c5e\u4e8e\u540c\u4e00\u4e2a\u5757\uff08Block\uff09\u7684\u7ebf\u7a0b\u5206\u7ec4\u3002\u8fd9\u79cd\u5206\u7ec4\u88ab\u79f0\u4e3a\u201cWarp\u201d\uff0c\u6bcf\u4e2aWarp\u5305\u542b\u56fa\u5b9a\u6570\u91cf\u7684\u7ebf\u7a0b\u3002\u5f53\u9700\u8981\u6267\u884c\u7684\u7ebf\u7a0b\u6570\u91cf\u8d85\u8fc7\u4e00\u4e2aWarp\u6240\u80fd\u5305\u542b\u7684\u6570\u91cf\u65f6\uff0cGPU\u4f1a\u8c03\u5ea6\u989d\u5916\u7684Warp\u3002\u8fd9\u6837\u505a\u7684\u539f\u5219\u662f\u786e\u4fdd\u6ca1\u6709\u4efb\u4f55\u7ebf\u7a0b\u88ab\u9057\u6f0f\uff0c\u5373\u4fbf\u8fd9\u610f\u5473\u7740\u9700\u8981\u542f\u52a8\u66f4\u591a\u7684Warp\u3002<\/p>\n\n\n\n<p>\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5982\u679c\u4e00\u4e2a\u5757\uff08Block\uff09\u6709128\u4e2a\u7ebf\u7a0b\uff08Thread\uff09\uff0c\u5e76\u4e14\u6211\u7684\u663e\u5361\u8eab\u7a7f\u76ae\u5939\u514b\uff08Nvidia\u6bcf\u4e2aWarp\u670932\u4e2aThread\uff09\uff0c\u90a3\u4e48\u4e00\u4e2a\u5757\uff08Block\uff09\u5c31\u4f1a\u6709 128\/32=4 \u4e2aWarp\u3002\u4e3e\u4e00\u4e2a\u6781\u7aef\u7684\u4f8b\u5b50\uff0c\u5982\u679c\u6709129\u4e2a\u7ebf\u7a0b\uff0c\u90a3\u4e48\u5c31\u4f1a\u5f005\u4e2aWarp\u3002\u670931\u4e2a\u7ebf\u7a0b\u4f4d\u7f6e\u5c06\u76f4\u63a5\u7a7a\u95f2\uff01\u56e0\u6b64\u6211\u4eec\u5728\u5199Compute Shader\u65f6\uff0c[numthreads(a,b,c)] \u4e2d\u7684 a<em>b<\/em>c \u6700\u597d\u662f32\u7684\u500d\u6570\uff0c\u51cf\u5c11CUDA\u6838\u5fc3\u7684\u6d6a\u8d39\u3002<\/p>\n\n\n\n<p>\u8bfb\u5230\u8fd9\u91cc\uff0c\u60f3\u5fc5\u4f60\u4e00\u5b9a\u4f1a\u5f88\u6df7\u4e71\u3002\u6211\u6309\u7167\u4e2a\u4eba\u7684\u7406\u89e3\u753b\u4e86\u4e2a\u56fe\u3002\u82e5\u6709\u9519\u8bef\u8bf7\u6307\u51fa\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-372.png\" alt=\"img\" class=\"wp-image-1517 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"496\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-372.png\" alt=\"img\" class=\"wp-image-1517 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-372.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-372-300x103.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-372-1024x353.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-372-768x265.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">L3 \u540e\u5904\u7406\u6548\u679c<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5f53\u524d\u6784\u5efa\u57fa\u4e8eBIRP\u7ba1\u7ebf\uff0cSRP\u7ba1\u7ebf\u53ea\u9700\u8981\u4fee\u6539\u51e0\u5904\u4ee3\u7801\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u8fd9\u4e00\u7ae0\u5173\u952e\u5728\u4e8e\u6784\u5efa\u4e00\u4e2a\u62bd\u8c61\u57fa\u7c7b\u7ba1\u7406Compute Shader\u6240\u9700\u7684\u8d44\u6e90\uff08\u7b2c\u4e00\u8282\uff09\u3002\u7136\u540e\u57fa\u4e8e\u8fd9\u4e2a\u62bd\u8c61\u57fa\u7c7b\uff0c\u7f16\u5199\u4e00\u4e9b\u7b80\u5355\u7684\u540e\u5904\u7406\u6548\u679c\uff0c\u6bd4\u5982\u9ad8\u65af\u6a21\u7cca\u3001\u7070\u9636\u6548\u679c\u3001\u4f4e\u5206\u8fa8\u7387\u50cf\u7d20\u6548\u679c\u4ee5\u53ca\u591c\u89c6\u4eea\u6548\u679c\u7b49\u7b49\u3002\u8fd9\u4e00\u7ae0\u7684\u77e5\u8bc6\u70b9\u7684\u5c0f\u603b\u7ed3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u83b7\u53d6\u548c\u5904\u7406Camera\u7684\u6e32\u67d3\u8d34\u56fe<\/li>\n\n\n\n<li>ExecuteInEditMode \u5173\u952e\u8bcd<\/li>\n\n\n\n<li>SystemInfo.supportsComputeShaders \u68c0\u67e5\u7cfb\u7edf\u662f\u5426\u652f\u6301<\/li>\n\n\n\n<li>Graphics.Blit() \u51fd\u6570\u7684\u4f7f\u7528\uff08\u5168\u7a0b\u662fBit Block Transfer\uff09<\/li>\n\n\n\n<li>\u7528 smoothstep() \u5236\u4f5c\u5404\u79cd\u6548\u679c<\/li>\n\n\n\n<li>\u591a\u4e2aKernel\u4e4b\u95f4\u4f20\u8f93\u6570\u636e Shared \u5173\u952e\u8bcd<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u4ecb\u7ecd\u4e0e\u51c6\u5907\u5de5\u4f5c<\/h3>\n\n\n\n<p>\u540e\u5904\u7406\u6548\u679c\u9700\u8981\u51c6\u5907\u4e24\u5f20\u8d34\u56fe\uff0c\u4e00\u4e2a\u53ea\u8bfb\uff0c\u53e6\u4e00\u4e2a\u53ef\u8bfb\u5199\u3002\u81f3\u4e8e\u8d34\u56fe\u4ece\u54ea\u6765\uff0c\u90fd\u8bf4\u662f\u540e\u5904\u7406\u4e86\uff0c\u90a3\u80af\u5b9a\u4ece\u76f8\u673a\u8eab\u4e0a\u83b7\u53d6\u8d34\u56fe\uff0c\u4e5f\u5c31\u662fCamera\u7ec4\u4ef6\u4e0a\u7684Target Texture\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Source\uff1a\u53ea\u8bfb<\/li>\n\n\n\n<li>Destination\uff1a\u53ef\u8bfb\u5199\uff0c\u7528\u4e8e\u6700\u7ec8\u8f93\u51fa<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-370.png\" alt=\"img\" class=\"wp-image-1515 lazyload\"\/><noscript><img decoding=\"async\" width=\"1262\" height=\"878\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-370.png\" alt=\"img\" class=\"wp-image-1515 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-370.png 1262w, https:\/\/remoooo.com\/wp-content\/uploads\/image-370-300x209.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-370-1024x712.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-370-768x534.png 768w\" sizes=\"(max-width: 1262px) 100vw, 1262px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u7531\u4e8e\u540e\u7eed\u4f1a\u5b9e\u73b0\u591a\u79cd\u540e\u5904\u7406\u6548\u679c\uff0c\u56e0\u6b64\u62bd\u8c61\u51fa\u4e00\u4e2a\u57fa\u7c7b\uff0c\u51cf\u5c11\u540e\u671f\u5de5\u4f5c\u91cf\u3002<\/p>\n\n\n\n<p>\u5728\u57fa\u7c7b\u4e2d\u5c01\u88c5\u4ee5\u4e0b\u7279\u6027\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u521d\u59cb\u5316\u8d44\u6e90\uff08\u521b\u5efa\u8d34\u56fe\u3001Buffer\u7b49\uff09<\/li>\n\n\n\n<li>\u7ba1\u7406\u8d44\u6e90\uff08\u6bd4\u65b9\u8bf4\u5c4f\u5e55\u5206\u8fa8\u7387\u6539\u53d8\u540e\uff0c\u91cd\u65b0\u521b\u5efaBuffer\u7b49\u7b49\uff09<\/li>\n\n\n\n<li>\u786c\u4ef6\u68c0\u67e5\uff08\u68c0\u67e5\u5f53\u524d\u8bbe\u5907\u662f\u5426\u652f\u6301Compute Shader\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u62bd\u8c61\u7c7b\u5b8c\u6574\u4ee3\u7801\u94fe\u63a5\uff1ahttps:\/\/pastebin.com\/9pYvHHsh<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u5f53\u811a\u672c\u5b9e\u4f8b\u88ab\u6fc0\u6d3b\u6216\u8005\u9644\u52a0\u5230\u6d3b\u7740\u7684GO\u7684\u65f6\u5019\uff0c\u8c03\u7528 OnEnable() \u3002\u5728\u91cc\u9762\u5199\u521d\u59cb\u5316\u7684\u64cd\u4f5c\u3002\u68c0\u67e5\u786c\u4ef6\u662f\u5426\u652f\u6301\u3001\u68c0\u67e5Compute Shader\u662f\u5426\u5728Inspector\u4e0a\u7ed1\u5b9a\u3001\u83b7\u53d6\u6307\u5b9a\u7684Kernel\u3001\u83b7\u53d6\u5f53\u524dGO\u7684Camera\u7ec4\u4ef6\u3001\u521b\u5efa\u7eb9\u7406\u4ee5\u53ca\u8bbe\u7f6e\u521d\u59cb\u5316\u72b6\u6001\u4e3a\u771f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (!SystemInfo.supportsComputeShaders)\n    ...\n\nif (!shader)\n    ...\n\nkernelHandle = shader.FindKernel(kernelName);\n\nthisCamera = GetComponent&lt;Camera&gt;();\n\nif (!thisCamera)\n    ...\n\nCreateTextures();\n\ninit = true;<\/code><\/pre>\n\n\n\n<p>\u521b\u5efa\u4e24\u4e2a\u7eb9\u7406 CreateTextures() \uff0c\u4e00\u4e2aSource\u4e00\u4e2aDestination\uff0c\u5c3a\u5bf8\u4e3a\u6444\u50cf\u673a\u5206\u8fa8\u7387\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>texSize.x = thisCamera.pixelWidth;\ntexSize.y = thisCamera.pixelHeight;\n\nif (shader)\n{\n    uint x, y;\n    shader.GetKernelThreadGroupSizes(kernelHandle, out x, out y, out _);\n    groupSize.x = Mathf.CeilToInt((float)texSize.x \/ (float)x);\n    groupSize.y = Mathf.CeilToInt((float)texSize.y \/ (float)y);\n}\n\nCreateTexture(ref output);\nCreateTexture(ref renderedSource);\n\nshader.SetTexture(kernelHandle, \"source\", renderedSource);\nshader.SetTexture(kernelHandle, \"outputrt\", output);<\/code><\/pre>\n\n\n\n<p>\u5177\u4f53\u7eb9\u7406\u7684\u521b\u5efa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected void CreateTexture(ref RenderTexture textureToMake, int divide=1)\n{\n    textureToMake = new RenderTexture(texSize.x\/divide, texSize.y\/divide, 0);\n    textureToMake.enableRandomWrite = true;\n    textureToMake.Create();\n}<\/code><\/pre>\n\n\n\n<p>\u8fd9\u6837\u5c31\u5b8c\u6210\u521d\u59cb\u5316\u4e86\uff0c\u5f53\u6444\u50cf\u673a\u5b8c\u6210\u573a\u666f\u6e32\u67d3\u5e76\u51c6\u5907\u663e\u793a\u5230\u5c4f\u5e55\u4e0a\u65f6\uff0cUnity\u4f1a\u8c03\u7528 OnRenderImage() \uff0c\u8fd9\u4e2a\u65f6\u5019\u5c31\u5f00\u59cb\u8c03\u7528Compute Shader\u5f00\u59cb\u8ba1\u7b97\u4e86\u3002\u82e5\u5f53\u524d\u6ca1\u521d\u59cb\u5316\u597d\u6216\u8005\u6ca1shader\uff0c\u5c31Blit\u4e00\u4e0b\uff0c\u628asource\u76f4\u63a5\u62f7\u7ed9destination\uff0c\u5373\u5565\u4e5f\u4e0d\u5e72\u3002 CheckResolution(out _) \u8fd9\u4e2a\u65b9\u6cd5\u68c0\u67e5\u6e32\u67d3\u7eb9\u7406\u7684\u5206\u8fa8\u7387\u662f\u5426\u9700\u8981\u66f4\u65b0\uff0c\u5982\u679c\u8981\uff0c\u5c31\u91cd\u65b0\u751f\u6210\u4e00\u4e0bTexture\u3002\u5b8c\u4e8b\u4e4b\u540e\uff0c\u5c31\u5230\u4e86\u8001\u751f\u5e38\u8c08\u7684Dispatch\u9636\u6bb5\u5566\u3002\u8fd9\u91cc\u5c31\u9700\u8981\u5c06source\u8d34\u56fe\u901a\u8fc7Buffer\u4f20\u7ed9GPU\uff0c\u8ba1\u7b97\u5b8c\u6bd5\u540e\uff0c\u4f20\u56de\u7ed9destination\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected virtual void OnRenderImage(RenderTexture source, RenderTexture destination)\n{\n    if (!init || shader == null)\n    {\n        Graphics.Blit(source, destination);\n    }\n    else\n    {\n        CheckResolution(out _);\n        DispatchWithSource(ref source, ref destination);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f\u770b\uff0c\u8fd9\u91cc\u6211\u4eec\u6ca1\u6709\u7528\u4ec0\u4e48 SetData() \u6216\u8005\u662f GetData() \u4e4b\u7c7b\u7684\u64cd\u4f5c\u3002\u56e0\u4e3a\u73b0\u5728\u6240\u6709\u6570\u636e\u90fd\u5728GPU\u4e0a\uff0c\u6211\u4eec\u76f4\u63a5\u547d\u4ee4GPU\u81ea\u4ea7\u81ea\u9500\u5c31\u597d\u4e86\uff0cCPU\u4e0d\u8981\u8d9f\u8fd9\u6ee9\u6d51\u6c34\u3002\u5982\u679c\u5c06\u7eb9\u7406\u53d6\u56de\u5185\u5b58\uff0c\u518d\u4f20\u7ed9GPU\uff0c\u6027\u80fd\u5c31\u76f8\u5f53\u7cdf\u7cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected virtual void DispatchWithSource(ref RenderTexture source, ref RenderTexture destination)\n{\n    Graphics.Blit(source, renderedSource);\n\n    shader.Dispatch(kernelHandle, groupSize.x, groupSize.y, 1);\n\n    Graphics.Blit(output, destination);\n}<\/code><\/pre>\n\n\n\n<p>\u6211\u4e0d\u4fe1\u90aa\uff0c\u975e\u5f97\u4f20\u56deCPU\u518d\u4f20\u56deGPU\uff0c\u6d4b\u8bd5\u7ed3\u679c\u76f8\u5f53\u9707\u60ca\uff0c\u6027\u80fd\u7adf\u7136\u5dee\u4e864\u500d\u4ee5\u4e0a\u3002\u56e0\u6b64\u6211\u4eec\u9700\u8981\u51cf\u5c11CPU\u548cGPU\u4e4b\u95f4\u7684\u901a\u4fe1\uff0c\u8fd9\u662f\u4f7f\u7528Compute Shader\u65f6\u975e\u5e38\u9700\u8981\u5173\u5fc3\u7684\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u7b28\u86cb\u65b9\u6cd5\nprotected virtual void DispatchWithSource(ref RenderTexture source, ref RenderTexture destination)\n{\n    \/\/ \u5c06\u6e90\u8d34\u56feBlit\u5230\u7528\u4e8e\u5904\u7406\u7684\u8d34\u56fe\n    Graphics.Blit(source, renderedSource);\n\n    \/\/ \u4f7f\u7528\u8ba1\u7b97\u7740\u8272\u5668\u5904\u7406\u8d34\u56fe\n    shader.Dispatch(kernelHandle, groupSize.x, groupSize.y, 1);\n\n    \/\/ \u5c06\u8f93\u51fa\u8d34\u56fe\u590d\u5236\u5230\u4e00\u4e2aTexture2D\u5bf9\u8c61\u4e2d\uff0c\u4ee5\u4fbf\u8bfb\u53d6\u6570\u636e\u5230CPU\n    Texture2D tempTexture = new Texture2D(renderedSource.width, renderedSource.height, TextureFormat.RGBA32, false);\n    RenderTexture.active = output;\n    tempTexture.ReadPixels(new Rect(0, 0, output.width, output.height), 0, 0);\n    tempTexture.Apply();\n    RenderTexture.active = null;\n\n    \/\/ \u5c06Texture2D\u6570\u636e\u4f20\u56deGPU\u5230\u4e00\u4e2a\u65b0\u7684RenderTexture\n    RenderTexture tempRenderTexture = RenderTexture.GetTemporary(output.width, output.height);\n    Graphics.Blit(tempTexture, tempRenderTexture);\n\n    \/\/ \u6700\u7ec8\u5c06\u5904\u7406\u540e\u7684\u8d34\u56feBlit\u5230\u76ee\u6807\u8d34\u56fe\n    Graphics.Blit(tempRenderTexture, destination);\n\n    \/\/ \u6e05\u7406\u8d44\u6e90\n    RenderTexture.ReleaseTemporary(tempRenderTexture);\n    Destroy(tempTexture);\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-375.png\" alt=\"img\" class=\"wp-image-1520 lazyload\"\/><noscript><img decoding=\"async\" width=\"1372\" height=\"436\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-375.png\" alt=\"img\" class=\"wp-image-1520 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-375.png 1372w, https:\/\/remoooo.com\/wp-content\/uploads\/image-375-300x95.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-375-1024x325.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-375-768x244.png 768w\" sizes=\"(max-width: 1372px) 100vw, 1372px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u63a5\u4e0b\u6765\u5f00\u59cb\u7f16\u5199\u7b2c\u4e00\u4e2a\u540e\u5904\u7406\u6548\u679c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5c0f\u63d2\u66f2\uff1a\u5947\u602a\u7684BUG<\/h3>\n\n\n\n<p>\u53e6\u5916\u63d2\u64ad\u4e00\u4e2a\u5947\u602abug\u3002<\/p>\n\n\n\n<p>\u5728Compute Shader\u4e2d\uff0c\u5982\u679c\u6700\u7ec8\u8f93\u51fa\u7684\u8d34\u56fe\u7ed3\u679c\u540d\u5b57\u662foutput\uff0c\u90a3\u4e48\u5728\u67d0\u4e9bAPI\u6bd4\u5982Metal\u4e2d\uff0c\u5c31\u4f1a\u51fa\u95ee\u9898\u3002\u89e3\u51b3\u65b9\u6cd5\u662f\uff0c\u6539\u4e2a\u540d\u5b57\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RWTexture2D&lt;float4&gt; outputrt;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-376.png\" alt=\"img\" class=\"wp-image-1521 lazyload\"\/><noscript><img decoding=\"async\" width=\"1090\" height=\"160\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-376.png\" alt=\"img\" class=\"wp-image-1521 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-376.png 1090w, https:\/\/remoooo.com\/wp-content\/uploads\/image-376-300x44.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-376-1024x150.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-376-768x113.png 768w\" sizes=\"(max-width: 1090px) 100vw, 1090px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u6dfb\u52a0\u56fe\u7247\u6ce8\u91ca\uff0c\u4e0d\u8d85\u8fc7 140 \u5b57\uff08\u53ef\u9009\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. RingHighlight\u6548\u679c<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-382.png\" alt=\"img\" class=\"wp-image-1527 lazyload\"\/><noscript><img decoding=\"async\" width=\"1088\" height=\"604\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-382.png\" alt=\"img\" class=\"wp-image-1527 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-382.png 1088w, https:\/\/remoooo.com\/wp-content\/uploads\/image-382-300x167.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-382-1024x568.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-382-768x426.png 768w\" sizes=\"(max-width: 1088px) 100vw, 1088px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u521b\u5efaRingHighlight\u7c7b\uff0c\u7ee7\u627f\u81ea\u521a\u521a\u7f16\u5199\u7684\u57fa\u7c7b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-378.png\" alt=\"img\" class=\"wp-image-1523 lazyload\"\/><noscript><img decoding=\"async\" width=\"684\" height=\"154\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-378.png\" alt=\"img\" class=\"wp-image-1523 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-378.png 684w, https:\/\/remoooo.com\/wp-content\/uploads\/image-378-300x68.png 300w\" sizes=\"(max-width: 684px) 100vw, 684px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u91cd\u8f7d\u521d\u59cb\u5316\u65b9\u6cd5\uff0c\u6307\u5b9aKernel\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected override void Init()\n{\n    center = new Vector4();\n    kernelName = \"Highlight\";\n    base.Init();\n}<\/code><\/pre>\n\n\n\n<p>\u91cd\u8f7d\u6e32\u67d3\u65b9\u6cd5\u3002\u60f3\u8981\u5b9e\u73b0\u805a\u7126\u67d0\u4e2a\u89d2\u8272\u7684\u6548\u679c\uff0c\u5219\u9700\u8981\u7ed9Compute Shader\u4f20\u5165\u89d2\u8272\u7684\u5c4f\u5e55\u7a7a\u95f4\u7684\u5750\u6807 center \u3002\u5e76\u4e14\uff0c\u5982\u679c\u5728Dispatch\u4e4b\u524d\uff0c\u5c4f\u5e55\u5206\u8fa8\u7387\u53d1\u751f\u6539\u53d8\uff0c\u90a3\u4e48\u91cd\u65b0\u521d\u59cb\u5316\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected void SetProperties()\n{\n    float rad = (radius \/ 100.0f) * texSize.y;\n    shader.SetFloat(\"radius\", rad);\n    shader.SetFloat(\"edgeWidth\", rad * softenEdge \/ 100.0f);\n    shader.SetFloat(\"shade\", shade);\n}\n\nprotected override void OnRenderImage(RenderTexture source, RenderTexture destination)\n{\n    if (!init || shader == null)\n    {\n        Graphics.Blit(source, destination);\n    }\n    else\n    {\n        if (trackedObject &amp;&amp; thisCamera)\n        {\n            Vector3 pos = thisCamera.WorldToScreenPoint(trackedObject.position);\n            center.x = pos.x;\n            center.y = pos.y;\n            shader.SetVector(\"center\", center);\n        }\n        bool resChange = false;\n        CheckResolution(out resChange);\n        if (resChange) SetProperties();\n        DispatchWithSource(ref source, ref destination);\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5e76\u4e14\u6539\u53d8Inspector\u9762\u677f\u7684\u65f6\u5019\u53ef\u4ee5\u5b9e\u65f6\u770b\u5230\u53c2\u6570\u53d8\u5316\u6548\u679c\uff0c\u6dfb\u52a0 OnValidate() \u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private void OnValidate()\n{\n    if(!init)\n        Init();\n\n    SetProperties();\n}<\/code><\/pre>\n\n\n\n<p>GPU\u4e2d\uff0c\u8be5\u600e\u4e48\u5236\u4f5c\u4e00\u4e2a\u5706\u5185\u6ca1\u6709\u9634\u5f71\uff0c\u5706\u7684\u8fb9\u7f18\u5e73\u6ed1\u8fc7\u6e21\uff0c\u8fc7\u6e21\u5c42\u5916\u662f\u9634\u5f71\u7684\u6548\u679c\u5462\uff1f\u57fa\u4e8e\u4e0a\u4e00\u7bc7\u6587\u7ae0\u5224\u65ad\u4e00\u4e2a\u70b9\u662f\u5426\u5728\u5706\u5185\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u7528 smoothstep() \uff0c\u5904\u7406\u8fc7\u6e21\u5c42\u5373\u53ef\u3002<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"#pragma kernel Highlight\n\nTexture2D&lt;float4&gt; source;\nRWTexture2D&lt;float4&gt; outputrt;\nfloat radius;\nfloat edgeWidth;\nfloat shade;\nfloat4 center;\n\nfloat inCircle( float2 pt, float2 center, float radius, float edgeWidth ){\n    float len = length(pt - center);\n    return 1.0 - smoothstep(radius-edgeWidth, radius, len);\n}\n\n[numthreads(8, 8, 1)]\nvoid Highlight(uint3 id : SV_DispatchThreadID)\n{\n    float4 srcColor = source[id.xy];\n    float4 shadedSrcColor = srcColor * shade;\n    float highlight = inCircle( (float2)id.xy, center.xy, radius, edgeWidth);\n    float4 color = lerp( shadedSrcColor, srcColor, highlight );\n\n    outputrt[id.xy] = color;\n\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">#<\/span><span style=\"color: #D8DEE9\">pragma<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">kernel<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Highlight<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">Texture2D<\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">source<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">RWTexture2D<\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">outputrt<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">radius<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">edgeWidth<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">shade<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">center<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">inCircle<\/span><span style=\"color: #D8DEE9FF\">( <\/span><span style=\"color: #D8DEE9\">float2<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">pt<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">float2<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">center<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">radius<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">edgeWidth<\/span><span style=\"color: #D8DEE9FF\"> )<\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">length<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">pt<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">center<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1.0<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">smoothstep<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">radius<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">edgeWidth<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">radius<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #88C0D0\">numthreads<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #B48EAD\">8<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">)]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Highlight<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">uint3<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #D8DEE9FF\"> : <\/span><span style=\"color: #D8DEE9\">SV_DispatchThreadID<\/span><span style=\"color: #D8DEE9FF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">srcColor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">source<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">xy<\/span><span style=\"color: #D8DEE9FF\">]<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">shadedSrcColor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">srcColor<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">shade<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">highlight<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">inCircle<\/span><span style=\"color: #D8DEE9FF\">( (<\/span><span style=\"color: #D8DEE9\">float2<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">xy<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">center<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">xy<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">radius<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">edgeWidth<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">float4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">color<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">lerp<\/span><span style=\"color: #D8DEE9FF\">( <\/span><span style=\"color: #D8DEE9\">shadedSrcColor<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">srcColor<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">highlight<\/span><span style=\"color: #D8DEE9FF\"> )<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">outputrt<\/span><span style=\"color: #D8DEE9FF\">[<\/span><span style=\"color: #D8DEE9\">id<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">xy<\/span><span style=\"color: #D8DEE9FF\">] <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">color<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-377.png\" alt=\"img\" class=\"wp-image-1522 lazyload\"\/><noscript><img decoding=\"async\" width=\"1030\" height=\"480\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-377.png\" alt=\"img\" class=\"wp-image-1522 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-377.png 1030w, https:\/\/remoooo.com\/wp-content\/uploads\/image-377-300x140.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-377-1024x477.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-377-768x358.png 768w\" sizes=\"(max-width: 1030px) 100vw, 1030px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5f53\u524d\u7248\u672c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compute Shader\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_RingHighlight\/Assets\/Shaders\/RingHighlight.compute<\/li>\n\n\n\n<li>CPU\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_RingHighlight\/Assets\/Scripts\/RingHighlight.cs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u6a21\u7cca\u6548\u679c<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-379.png\" alt=\"img\" class=\"wp-image-1524 lazyload\"\/><noscript><img decoding=\"async\" width=\"1106\" height=\"602\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-379.png\" alt=\"img\" class=\"wp-image-1524 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-379.png 1106w, https:\/\/remoooo.com\/wp-content\/uploads\/image-379-300x163.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-379-1024x557.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-379-768x418.png 768w\" sizes=\"(max-width: 1106px) 100vw, 1106px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u6a21\u7cca\u6548\u679c\u539f\u7406\u5f88\u7b80\u5355\uff0c\u6bcf\u4e00\u4e2a\u50cf\u7d20\u91c7\u6837\u5468\u8fb9\u7684 n*n \u4e2a\u50cf\u7d20\u52a0\u6743\u5e73\u5747\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u7ec8\u6548\u679c\u3002<\/p>\n\n\n\n<p>\u4f46\u662f\u6709\u6548\u7387\u95ee\u9898\u3002\u4f17\u6240\u5468\u77e5\uff0c\u51cf\u5c11\u5bf9\u7eb9\u7406\u7684\u91c7\u6837\u6b21\u6570\u5bf9\u4f18\u5316\u975e\u5e38\u91cd\u8981\u3002\u5982\u679c\u6bcf\u4e2a\u50cf\u7d20\u90fd\u9700\u8981\u91c7\u683720*20\u4e2a\u5468\u8fb9\u50cf\u7d20\uff0c\u90a3\u4e48\u6e32\u67d3\u4e00\u4e2a\u50cf\u7d20\u5c31\u9700\u8981\u91c7\u6837400\u6b21\uff0c\u663e\u7136\u662f\u65e0\u6cd5\u63a5\u53d7\u7684\u3002\u5e76\u4e14\uff0c\u5bf9\u4e8e\u5355\u4e2a\u50cf\u7d20\u800c\u8a00\uff0c\u91c7\u96c6\u5468\u8fb9\u4e00\u6574\u4e2a\u77e9\u5f62\u50cf\u7d20\u7684\u64cd\u4f5c\u5728Compute Shader\u4e2d\u5f88\u96be\u5904\u7406\u3002\u600e\u4e48\u89e3\u51b3\u5462\uff1f<\/p>\n\n\n\n<p>\u901a\u5e38\u505a\u6cd5\u662f\uff0c\u6a2a\u7740\u91c7\u6837\u4e00\u904d\uff0c\u518d\u7ad6\u7740\u91c7\u6837\u4e00\u904d\u3002\u4ec0\u4e48\u610f\u601d\u5462\uff1f\u5bf9\u4e8e\u6bcf\u4e00\u4e2a\u50cf\u7d20\uff0c\u53ea\u5728x\u65b9\u5411\u4e0a\u91c7\u683720\u4e2a\u50cf\u7d20\uff0cy\u65b9\u5411\u4e0a\u91c7\u683720\u4e2a\u50cf\u7d20\uff0c\u603b\u5171\u91c7\u683720+20\u4e2a\u50cf\u7d20\uff0c\u518d\u52a0\u6743\u5e73\u5747\u3002\u8fd9\u79cd\u65b9\u6cd5\u4e0d\u4ec5\u51cf\u5c11\u4e86\u91c7\u6837\u6b21\u6570\uff0c\u8fd8\u66f4\u7b26\u5408Compute Shader\u7684\u903b\u8f91\u3002\u6a2a\u7740\u91c7\u6837\uff0c\u8bbe\u7f6e\u4e00\u4e2aKernel\uff1b\u7ad6\u7740\u91c7\u6837\uff0c\u8bbe\u7f6e\u53e6\u4e00\u4e2aKernel\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#pragma kernel HorzPass\n#pragma kernel Highlight<\/code><\/pre>\n\n\n\n<p>\u7531\u4e8eDispatch\u662f\u987a\u5e8f\u6267\u884c\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u8ba1\u7b97\u5b8c\u6c34\u5e73\u7684\u6a21\u7cca\u540e\uff0c\u5229\u7528\u8ba1\u7b97\u597d\u7684\u7ed3\u679c\u518d\u5782\u76f4\u91c7\u6837\u4e00\u904d\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shader.Dispatch(kernelHorzPassID, groupSize.x, groupSize.y, 1);\nshader.Dispatch(kernelHandle, groupSize.x, groupSize.y, 1);<\/code><\/pre>\n\n\n\n<p>\u505a\u5b8c\u6a21\u7cca\u64cd\u4f5c\u4e4b\u540e\uff0c\u518d\u7ed3\u5408\u4e0a\u4e00\u8282\u7684RingHighlight\uff0c\u5b8c\u5de5\uff01<\/p>\n\n\n\n<p>\u6709\u4e00\u70b9\u4e0d\u540c\u7684\u662f\uff0c\u518d\u8ba1\u7b97\u5b8c\u6c34\u5e73\u6a21\u7cca\u540e\uff0c\u600e\u4e48\u5c06\u7ed3\u679c\u4f20\u7ed9\u4e0b\u4e00\u4e2aKernel\u5462\uff1f\u7b54\u6848\u547c\u4e4b\u6b32\u51fa\u4e86\uff0c\u76f4\u63a5\u4f7f\u7528 shared \u5173\u952e\u8bcd\u3002\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\u3002<\/p>\n\n\n\n<p>CPU\u4e2d\u58f0\u660e\u5b58\u50a8\u6c34\u5e73\u6a21\u7cca\u7eb9\u7406\u7684\u5f15\u7528\uff0c\u5236\u4f5c\u6c34\u5e73\u7eb9\u7406\u7684kernel\uff0c\u5e76\u7ed1\u5b9a\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RenderTexture horzOutput = null;\nint kernelHorzPassID;\n\nprotected override void Init()\n{\n    ...\n    kernelHorzPassID = shader.FindKernel(\"HorzPass\");\n    ...\n}<\/code><\/pre>\n\n\n\n<p>\u8fd8\u9700\u8981\u989d\u5916\u5728GPU\u4e2d\u5f00\u8f9f\u7a7a\u95f4\uff0c\u7528\u6765\u5b58\u50a8\u7b2c\u4e00\u4e2akernel\u7684\u7ed3\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protected override void CreateTextures()\n{\n    base.CreateTextures();\n    shader.SetTexture(kernelHorzPassID, \"source\", renderedSource);\n\n    CreateTexture(ref horzOutput);\n\n    shader.SetTexture(kernelHorzPassID, \"horzOutput\", horzOutput);\n    shader.SetTexture(kernelHandle, \"horzOutput\", horzOutput);\n}<\/code><\/pre>\n\n\n\n<p>GPU\u4e0a\u8fd9\u6837\u8bbe\u7f6e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shared Texture2D&lt;float4&gt; source;\nshared RWTexture2D&lt;float4&gt; horzOutput;\nRWTexture2D&lt;float4&gt; outputrt;<\/code><\/pre>\n\n\n\n<p>\u53e6\u5916\u6709\u4e2a\u7591\u95ee\uff0c shared \u8fd9\u4e2a\u5173\u952e\u8bcd\u597d\u50cf\u52a0\u4e0d\u52a0\u90fd\u4e00\u6837\uff0c\u5b9e\u9645\u6d4b\u8bd5\u4e0d\u540c\u7684kernel\u90fd\u53ef\u4ee5\u8bbf\u95ee\u5230\u3002\u90a3\u8bf7\u95eeshared\u8fd8\u6709\u4ec0\u4e48\u610f\u4e49\u5462\uff1f<\/p>\n\n\n\n<p>\u5728Unity\u4e2d\uff0c\u53d8\u91cf\u524d\u52a0shared\u8868\u793a\u8fd9\u4e2a\u8d44\u6e90\u4e0d\u662f\u6bcf\u6b21\u8c03\u7528\u90fd\u91cd\u65b0\u521d\u59cb\u5316\uff0c\u800c\u662f\u4fdd\u6301\u5176\u72b6\u6001\uff0c\u4f9b\u4e0d\u540c\u7684shader\u6216dispatch\u8c03\u7528\u4f7f\u7528\u3002\u8fd9\u6709\u52a9\u4e8e\u5728\u4e0d\u540c\u7684shader\u8c03\u7528\u4e4b\u95f4\u5171\u4eab\u6570\u636e\u3002\u6807\u8bb0\u4e86 shared \u53ef\u4ee5\u5e2e\u52a9\u7f16\u8bd1\u5668\u4f18\u5316\u51fa\u66f4\u9ad8\u6027\u80fd\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-380.png\" alt=\"img\" class=\"wp-image-1525 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"573\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-380.png\" alt=\"img\" class=\"wp-image-1525 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-380.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-380-300x119.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-380-1024x407.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-380-768x306.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5728\u8ba1\u7b97\u8fb9\u754c\u7684\u50cf\u7d20\u65f6\uff0c\u4f1a\u9047\u5230\u53ef\u7528\u50cf\u7d20\u6570\u91cf\u4e0d\u8db3\u7684\u60c5\u51b5\u3002\u8981\u4e48\u5c31\u662f\u5de6\u8fb9\u5269\u4e0b\u7684\u50cf\u7d20\u4e0d\u8db3 blurRadius \uff0c\u8981\u4e48\u53f3\u8fb9\u5269\u4f59\u50cf\u7d20\u4e0d\u8db3\u3002\u56e0\u6b64\u5148\u7b97\u51fa\u5b89\u5168\u7684\u5de6\u7d22\u5f15\uff0c\u7136\u540e\u518d\u8ba1\u7b97\u4ece\u5de6\u5230\u53f3\u6700\u5927\u53ef\u4ee5\u53d6\u591a\u5c11\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;numthreads(8, 8, 1)]\nvoid HorzPass(uint3 id : SV_DispatchThreadID)\n{\n    int left = max(0, (int)id.x-blurRadius);\n    int count = min(blurRadius, (int)id.x) + min(blurRadius, source.Length.x - (int)id.x);\n    float4 color = 0;\n\n    uint2 index = uint2((uint)left, id.y);\n\n    &#91;unroll(100)]\n    for(int x=0; x&lt;count; x++){\n        color += source&#91;index];\n        index.x++;\n    }\n\n    color \/= (float)count;\n    horzOutput&#91;id.xy] = color;\n\n}\n\n&#91;numthreads(8, 8, 1)]\nvoid Highlight(uint3 id : SV_DispatchThreadID)\n{\n    \/\/Vert blur\n    int top = max(0, (int)id.y-blurRadius);\n    int count = min(blurRadius, (int)id.y) + min(blurRadius, source.Length.y - (int)id.y);\n    float4 blurColor = 0;\n\n    uint2 index = uint2(id.x, (uint)top);\n\n    &#91;unroll(100)]\n    for(int y=0; y&lt;count; y++){\n        blurColor += horzOutput&#91;index];\n        index.y++;\n    }\n\n    blurColor \/= (float)count;\n\n    float4 srcColor = source&#91;id.xy];\n    float4 shadedBlurColor = blurColor * shade;\n    float highlight = inCircle( (float2)id.xy, center.xy, radius, edgeWidth);\n    float4 color = lerp( shadedBlurColor, srcColor, highlight );\n\n    outputrt&#91;id.xy] = color;\n\n}<\/code><\/pre>\n\n\n\n<p>\u5f53\u524d\u7248\u672c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compute Shader\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_BlurEffect\/Assets\/Shaders\/BlurHighlight.compute<\/li>\n\n\n\n<li>CPU\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_BlurEffect\/Assets\/Scripts\/BlurHighlight.cs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u9ad8\u65af\u6a21\u7cca<\/h3>\n\n\n\n<p>\u548c\u4e0a\u9762\u4e0d\u540c\u7684\u662f\uff0c\u91c7\u6837\u4e4b\u540e\u4e0d\u518d\u662f\u53d6\u5e73\u5747\u503c\uff0c\u800c\u662f\u7528\u4e00\u4e2a\u9ad8\u65af\u51fd\u6570\u52a0\u6743\u6c42\u5f97\u3002<\/p>\n\n\n\n<p>\u5176\u4e2d\uff0c \u662f\u6807\u51c6\u5dee\uff0c\u63a7\u5236\u5bbd\u5ea6\u3002<\/p>\n\n\n\n<p>\u6709\u5173\u66f4\u591aBlur\u7684\u5185\u5bb9\uff1ahttps:\/\/www.gamedeveloper.com\/programming\/four-tricks-for-fast-blurring-in-software-and-hardware#close-modal<\/p>\n\n\n\n<p>\u7531\u4e8e\u8fd9\u4e2a\u8ba1\u7b97\u91cf\u8fd8\u6709\u4e0d\u5c0f\u7684\uff0c\u5982\u679c\u6bcf\u4e00\u4e2a\u50cf\u7d20\u90fd\u53bb\u8ba1\u7b97\u4e00\u6b21\u8fd9\u4e2a\u5f0f\u5b50\u5c31\u975e\u5e38\u8017\u3002\u6211\u4eec\u7528\u9884\u8ba1\u7b97\u7684\u65b9\u5f0f\uff0c\u5c06\u8ba1\u7b97\u7ed3\u679c\u901a\u8fc7Buffer\u7684\u65b9\u5f0f\u4f20\u5230GPU\u4e0a\u3002\u7531\u4e8e\u4e24\u4e2akernel\u90fd\u9700\u8981\u4f7f\u7528\uff0c\u5728Buffer\u58f0\u660e\u7684\u65f6\u5019\u52a0\u4e00\u4e2ashared\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float&#91;] SetWeightsArray(int radius, float sigma)\n{\n    int total = radius * 2 + 1;\n    float&#91;] weights = new float&#91;total];\n    float sum = 0.0f;\n\n    for (int n=0; n&lt;radius; n++)\n    {\n        float weight = 0.39894f * Mathf.Exp(-0.5f * n * n \/ (sigma * sigma)) \/ sigma;\n        weights&#91;radius + n] = weight;\n        weights&#91;radius - n] = weight;\n        if (n != 0)\n            sum += weight * 2.0f;\n        else\n            sum += weight;\n    }\n    \/\/ normalize kernels\n    for (int i=0; i&lt;total; i++) weights&#91;i] \/= sum;\n\n    return weights;\n}\n\nprivate void UpdateWeightsBuffer()\n{\n    if (weightsBuffer != null)\n        weightsBuffer.Dispose();\n\n    float sigma = (float)blurRadius \/ 1.5f;\n\n    weightsBuffer = new ComputeBuffer(blurRadius * 2 + 1, sizeof(float));\n    float&#91;] blurWeights = SetWeightsArray(blurRadius, sigma);\n    weightsBuffer.SetData(blurWeights);\n\n    shader.SetBuffer(kernelHorzPassID, \"weights\", weightsBuffer);\n    shader.SetBuffer(kernelHandle, \"weights\", weightsBuffer);\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-384.png\" alt=\"img\" class=\"wp-image-1529 lazyload\"\/><noscript><img decoding=\"async\" width=\"1354\" height=\"912\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-384.png\" alt=\"img\" class=\"wp-image-1529 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-384.png 1354w, https:\/\/remoooo.com\/wp-content\/uploads\/image-384-300x202.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-384-1024x690.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-384-768x517.png 768w\" sizes=\"(max-width: 1354px) 100vw, 1354px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5b8c\u6574\u4ee3\u7801\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>https:\/\/pastebin.com\/0qWtUKgy<\/li>\n\n\n\n<li>https:\/\/pastebin.com\/A6mDKyJE<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5. \u4f4e\u5206\u8fa8\u7387\u6548\u679c<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>GPU\uff1a\u771f\u662f\u9163\u7545\u6dcb\u6f13\u7684\u8ba1\u7b97\u554a\u3002<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-381.png\" alt=\"img\" class=\"wp-image-1526 lazyload\"\/><noscript><img decoding=\"async\" width=\"854\" height=\"518\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-381.png\" alt=\"img\" class=\"wp-image-1526 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-381.png 854w, https:\/\/remoooo.com\/wp-content\/uploads\/image-381-300x182.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-381-768x466.png 768w\" sizes=\"(max-width: 854px) 100vw, 854px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u8ba9\u4e00\u5f20\u9ad8\u6e05\u7684\u7eb9\u7406\u8fb9\u6a21\u7cca\uff0c\u540c\u65f6\u4e0d\u4fee\u6539\u5206\u8fa8\u7387\u3002\u5b9e\u73b0\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u6bcf n*n \u4e2a\u50cf\u7d20\uff0c\u90fd\u53ea\u53d6\u5de6\u4e0b\u89d2\u7684\u50cf\u7d20\u989c\u8272\u5373\u53ef\u3002\u5229\u7528\u6574\u6570\u7684\u7279\u6027\uff0cid.x\u7d22\u5f15\u5148\u9664n\uff0c\u518d\u4e58\u4e0an\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uint2 index = (uint2(id.x, id.y)\/3) * 3;\nfloat3 srcColor = source&#91;index].rgb;\nfloat3 finalColor = srcColor;<\/code><\/pre>\n\n\n\n<p>\u6548\u679c\u5df2\u7ecf\u653e\u5728\u4e0a\u9762\u4e86\u3002\u4f46\u662f\u8fd9\u4e2a\u6548\u679c\u592a\u9510\u5229\u4e86\uff0c\u901a\u8fc7\u6dfb\u52a0\u566a\u58f0\uff0c\u67d4\u5316\u952f\u9f7f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uint2 index = (uint2(id.x, id.y)\/3) * 3;\n\nfloat noise = random(id.xy, time);\nfloat3 srcColor = lerp(source&#91;id.xy].rgb, source&#91;index],noise);\nfloat3 finalColor = srcColor;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-383.png\" alt=\"img\" class=\"wp-image-1528 lazyload\"\/><noscript><img decoding=\"async\" width=\"1018\" height=\"484\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-383.png\" alt=\"img\" class=\"wp-image-1528 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-383.png 1018w, https:\/\/remoooo.com\/wp-content\/uploads\/image-383-300x143.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-383-768x365.png 768w\" sizes=\"(max-width: 1018px) 100vw, 1018px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u6bcf n*n \u4e2a\u683c\u5b50\u7684\u50cf\u7d20\u4e0d\u5728\u53ea\u53d6\u5de6\u4e0b\u89d2\u7684\u989c\u8272\uff0c\u800c\u662f\u53d6\u539f\u672c\u989c\u8272\u548c\u5de6\u4e0b\u89d2\u989c\u8272\u7684\u968f\u673a\u63d2\u503c\u7ed3\u679c\u3002\u6548\u679c\u4e00\u4e0b\u5b50\u5c31\u7cbe\u7ec6\u4e86\u4e0d\u5c11\u3002\u5f53n\u6bd4\u8f83\u5927\u7684\u65f6\u5019\uff0c\u8fd8\u80fd\u770b\u5230\u4e0b\u9762\u8fd9\u6837\u7684\u6548\u679c\u3002\u53ea\u80fd\u8bf4\u4e0d\u592a\u597d\u770b\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u6545\u969c\u98ce\u683c\u9053\u8def\u4e2d\u8fd8\u662f\u53ef\u4ee5\u7ee7\u7eed\u63a2\u7d22\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-385.png\" alt=\"img\" class=\"wp-image-1530 lazyload\"\/><noscript><img decoding=\"async\" width=\"1252\" height=\"514\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-385.png\" alt=\"img\" class=\"wp-image-1530 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-385.png 1252w, https:\/\/remoooo.com\/wp-content\/uploads\/image-385-300x123.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-385-1024x420.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-385-768x315.png 768w\" sizes=\"(max-width: 1252px) 100vw, 1252px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5982\u679c\u60f3\u8981\u5f97\u5230\u566a\u58f0\u611f\u7684\u753b\u9762\uff0c\u53ef\u4ee5\u5c1d\u8bd5lerp\u7684\u4e24\u7aef\u6dfb\u52a0\u7cfb\u6570\uff0c\u6bd4\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float3 srcColor = lerp(source&#91;id.xy].rgb * 2, source&#91;index],noise);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-386.png\" alt=\"img\" class=\"wp-image-1531 lazyload\"\/><noscript><img decoding=\"async\" width=\"740\" height=\"376\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-386.png\" alt=\"img\" class=\"wp-image-1531 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-386.png 740w, https:\/\/remoooo.com\/wp-content\/uploads\/image-386-300x152.png 300w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">6. \u7070\u9636\u6548\u679c\u4e0e\u67d3\u8272<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Grayscale Effect &amp; Tinted<\/p>\n<\/blockquote>\n\n\n\n<p>\u5c06\u5f69\u8272\u56fe\u50cf\u8f6c\u6362\u4e3a\u7070\u9636\u56fe\u50cf\u7684\u8fc7\u7a0b\u6d89\u53ca\u5c06\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\u8f6c\u6362\u4e3a\u4e00\u4e2a\u5355\u4e00\u7684\u989c\u8272\u503c\u3002\u8fd9\u4e2a\u989c\u8272\u503c\u662fRGB\u503c\u7684\u52a0\u6743\u5e73\u5747\u503c\u3002\u8fd9\u91cc\u6709\u4e24\u79cd\u65b9\u6cd5\uff0c\u4e00\u79cd\u662f\u7b80\u5355\u5e73\u5747\uff0c\u4e00\u79cd\u662f\u7b26\u5408\u4eba\u773c\u611f\u77e5\u7684\u52a0\u6743\u5e73\u5747\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5e73\u5747\u503c\u6cd5\uff08\u7b80\u5355\u4f46\u4e0d\u51c6\u786e\uff09\uff1a<\/li>\n<\/ol>\n\n\n\n<p>\u8fd9\u79cd\u65b9\u6cd5\u5bf9\u6240\u6709\u989c\u8272\u901a\u9053\u7ed9\u4e88\u76f8\u540c\u7684\u6743\u91cd\u3002 2. \u52a0\u6743\u5e73\u5747\u6cd5\uff08\u66f4\u51c6\u786e, \u53cd\u6620\u4eba\u773c\u611f\u77e5\uff09\uff1a<\/p>\n\n\n\n<p>\u8fd9\u79cd\u65b9\u6cd5\u6839\u636e\u4eba\u773c\u5bf9\u7eff\u8272\u66f4\u654f\u611f\u3001\u5bf9\u7ea2\u8272\u6b21\u4e4b\u3001\u5bf9\u84dd\u8272\u6700\u4e0d\u654f\u611f\u7684\u7279\u70b9, \u7ed9\u4e88\u4e0d\u540c\u989c\u8272\u901a\u9053\u4e0d\u540c\u7684\u6743\u91cd\u3002\uff08\u4e0b\u9762\u7684\u622a\u56fe\u6548\u679c\u4e0d\u592a\u597d\uff0c\u6211\u4e5f\u6ca1\u770b\u51fa\u6765lol\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-388.png\" alt=\"img\" class=\"wp-image-1533 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"570\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-388.png\" alt=\"img\" class=\"wp-image-1533 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-388.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-388-300x119.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-388-1024x405.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-388-768x304.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u52a0\u6743\u540e\uff0c\u518d\u7b80\u5355\u5730\u989c\u8272\u6df7\u5408\uff08\u4e58\u6cd5\uff09\uff0c\u6700\u540elerp\u5f97\u5230\u53ef\u63a7\u7684\u67d3\u8272\u5f3a\u5ea6\u7ed3\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uint2 index = (uint2(id.x, id.y)\/6) * 6;\n\nfloat noise = random(id.xy, time);\nfloat3 srcColor = lerp(source&#91;id.xy].rgb, source&#91;index],noise);\n\/\/ float3 finalColor = srcColor;\n\nfloat3 grayScale = (srcColor.r+srcColor.g+srcColor.b)\/3.0;\n\/\/ float3 grayScale = srcColor.r*0.299f+srcColor.g*0.587f+srcColor.b*0.114f;\n\nfloat3 tinted = grayScale * tintColor.rgb;\nfloat3 finalColor = lerp(srcColor, tinted, tintStrength);\n\noutputrt&#91;id.xy] = float4(finalColor, 1);<\/code><\/pre>\n\n\n\n<p>\u67d3\u4e00\u4e2a\u5e9f\u571f\u989c\u8272\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-390.png\" alt=\"img\" class=\"wp-image-1535 lazyload\"\/><noscript><img decoding=\"async\" width=\"1258\" height=\"618\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-390.png\" alt=\"img\" class=\"wp-image-1535 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-390.png 1258w, https:\/\/remoooo.com\/wp-content\/uploads\/image-390-300x147.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-390-1024x503.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-390-768x377.png 768w\" sizes=\"(max-width: 1258px) 100vw, 1258px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">7. \u5c4f\u5e55\u626b\u63cf\u7ebf\u6548\u679c<\/h3>\n\n\n\n<p>\u9996\u5148 uvY \u5c06\u5750\u6807\u5f52\u4e00\u5316\u5230 [0,1] \u3002<\/p>\n\n\n\n<p>lines \u662f\u63a7\u5236\u626b\u63cf\u7ebf\u6570\u91cf\u7684\u4e00\u4e2a\u53c2\u6570\u3002<\/p>\n\n\n\n<p>\u7136\u540e\u589e\u52a0\u4e00\u4e2a\u65f6\u95f4\u504f\u79fb\uff0c\u7cfb\u6570\u63a7\u5236\u504f\u79fb\u901f\u5ea6\u3002\u53ef\u4ee5\u5f00\u653e\u4e00\u4e2a\u53c2\u6570\u63a7\u5236\u7ebf\u6761\u504f\u79fb\u7684\u901f\u5ea6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float uvY = (float)id.y\/(float)source.Length.y;\nfloat scanline = saturate(frac(uvY * lines + time * 3));<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-389.png\" alt=\"img\" class=\"wp-image-1534 lazyload\"\/><noscript><img decoding=\"async\" width=\"646\" height=\"318\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-389.png\" alt=\"img\" class=\"wp-image-1534 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-389.png 646w, https:\/\/remoooo.com\/wp-content\/uploads\/image-389-300x148.png 300w\" sizes=\"(max-width: 646px) 100vw, 646px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u8fd9\u4e2a\u201c\u7ebf\u201d\u770b\u8d77\u6765\u4e0d\u592a\u591f\u201c\u7ebf\u201d\uff0c\u51cf\u4e2a\u80a5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float uvY = (float)id.y\/(float)source.Length.y;\nfloat scanline = saturate(smoothstep(0.1,0.2,frac(uvY * lines + time * 3)));<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-387.png\" alt=\"img\" class=\"wp-image-1532 lazyload\"\/><noscript><img decoding=\"async\" width=\"786\" height=\"394\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-387.png\" alt=\"img\" class=\"wp-image-1532 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-387.png 786w, https:\/\/remoooo.com\/wp-content\/uploads\/image-387-300x150.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-387-768x385.png 768w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u7136\u540elerp\u4e0a\u989c\u8272\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float uvY = (float)id.y\/(float)source.Length.y;\nfloat scanline = saturate(smoothstep(0.1, 0.2, frac(uvY * lines + time*3)) + 0.3);\nfinalColor = lerp(source&#91;id.xy].rgb*0.5, finalColor, scanline);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-395.png\" alt=\"img\" class=\"wp-image-1540 lazyload\"\/><noscript><img decoding=\"async\" width=\"1140\" height=\"568\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-395.png\" alt=\"img\" class=\"wp-image-1540 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-395.png 1140w, https:\/\/remoooo.com\/wp-content\/uploads\/image-395-300x149.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-395-1024x510.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-395-768x383.png 768w\" sizes=\"(max-width: 1140px) 100vw, 1140px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u201c\u51cf\u80a5\u201d\u524d\u540e\uff0c\u5404\u53d6\u6240\u9700\u5427\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-391.png\" alt=\"img\" class=\"wp-image-1536 lazyload\"\/><noscript><img decoding=\"async\" width=\"1066\" height=\"448\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-391.png\" alt=\"img\" class=\"wp-image-1536 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-391.png 1066w, https:\/\/remoooo.com\/wp-content\/uploads\/image-391-300x126.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-391-1024x430.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-391-768x323.png 768w\" sizes=\"(max-width: 1066px) 100vw, 1066px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">8. \u591c\u89c6\u4eea\u6548\u679c<\/h3>\n\n\n\n<p>\u8fd9\u4e00\u8282\u603b\u7ed3\u4e0a\u9762\u6240\u6709\u5185\u5bb9\uff0c\u5b9e\u73b0\u4e00\u4e2a\u591c\u89c6\u4eea\u7684\u6548\u679c\u3002\u5148\u505a\u4e00\u4e2a\u5355\u773c\u6548\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float2 pt = (float2)id.xy;\nfloat2 center = (float2)(source.Length &gt;&gt; 1);\nfloat inVision = inCircle(pt, center, radius, edgeWidth);\nfloat3 blackColor = float3(0,0,0);\nfinalColor = lerp(blackColor, finalColor, inVision);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-394.png\" alt=\"img\" class=\"wp-image-1539 lazyload\"\/><noscript><img decoding=\"async\" width=\"1400\" height=\"666\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-394.png\" alt=\"img\" class=\"wp-image-1539 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-394.png 1400w, https:\/\/remoooo.com\/wp-content\/uploads\/image-394-300x143.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-394-1024x487.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-394-768x365.png 768w\" sizes=\"(max-width: 1400px) 100vw, 1400px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u53cc\u773c\u6548\u679c\u4e0d\u540c\u70b9\u5728\u4e8e\u6709\u4e24\u4e2a\u5706\u5fc3\uff0c\u8ba1\u7b97\u5f97\u5230\u7684\u4e24\u4e2a\u906e\u7f69vision\u7528 max() \u6216\u8005\u662f saturate() \u5408\u5e76\u5373\u53ef\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float2 pt = (float2)id.xy;\nfloat2 centerLeft = float2(source.Length.x \/ 3.0, source.Length.y \/2);\nfloat2 centerRight = float2(source.Length.x \/ 3.0 * 2.0, source.Length.y \/2);\nfloat inVisionLeft = inCircle(pt, centerLeft, radius, edgeWidth);\nfloat inVisionRight = inCircle(pt, centerRight, radius, edgeWidth);\nfloat3 blackColor = float3(0,0,0);\n\/\/ float inVision = max(inVisionLeft, inVisionRight);\nfloat inVision = saturate(inVisionLeft + inVisionRight);\nfinalColor = lerp(blackColor, finalColor, inVision);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-403.png\" alt=\"img\" class=\"wp-image-1548 lazyload\"\/><noscript><img decoding=\"async\" width=\"1432\" height=\"746\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-403.png\" alt=\"img\" class=\"wp-image-1548 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-403.png 1432w, https:\/\/remoooo.com\/wp-content\/uploads\/image-403-300x156.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-403-1024x533.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-403-768x400.png 768w\" sizes=\"(max-width: 1432px) 100vw, 1432px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5f53\u524d\u7248\u672c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compute Shader\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_NightVision\/Assets\/Shaders\/NightVision.compute<\/li>\n\n\n\n<li>CPU\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_NightVision\/Assets\/Scripts\/NightVision.cs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9. \u5e73\u7f13\u8fc7\u6e21\u7ebf\u6761<\/h3>\n\n\n\n<p>\u601d\u8003\u4e00\u4e0b\uff0c\u6211\u4eec\u5e94\u8be5\u600e\u4e48\u5728\u5c4f\u5e55\u4e0a\u753b\u4e00\u6761\u5e73\u6ed1\u8fc7\u6e21\u7684\u76f4\u7ebf\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-393.png\" alt=\"img\" class=\"wp-image-1538 lazyload\"\/><noscript><img decoding=\"async\" width=\"776\" height=\"224\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-393.png\" alt=\"img\" class=\"wp-image-1538 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-393.png 776w, https:\/\/remoooo.com\/wp-content\/uploads\/image-393-300x87.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-393-768x222.png 768w\" sizes=\"(max-width: 776px) 100vw, 776px\" \/><\/noscript><\/figure>\n\n\n\n<p>smoothstep() \u51fd\u6570\u53ef\u4ee5\u5b8c\u6210\u8fd9\u4e2a\u64cd\u4f5c\uff0c\u719f\u6089\u8fd9\u4e2a\u51fd\u6570\u7684\u8bfb\u8005\u53ef\u4ee5\u7565\u8fc7\u8fd9\u4e00\u6bb5\u3002\u8fd9\u4e2a\u51fd\u6570\u7528\u6765\u521b\u5efa\u5e73\u6ed1\u7684\u6e10\u53d8\u3002smoothstep(edge0, edge1, x) \u51fd\u6570\u5728x\u5728 edge0 \u548c edge1 \u4e4b\u95f4\u65f6\uff0c\u8f93\u51fa\u503c\u4ece0\u6e10\u53d8\u52301\u3002\u5982\u679c x &lt; edge0 \uff0c\u8fd4\u56de0\uff1b\u5982\u679c x &gt; edge1 \uff0c\u8fd4\u56de1\u3002\u5176\u8f93\u51fa\u503c\u662f\u6839\u636eHermite\u63d2\u503c\u8ba1\u7b97\u7684\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-392.png\" alt=\"img\" class=\"wp-image-1537 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"764\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-392.png\" alt=\"img\" class=\"wp-image-1537 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-392.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-392-300x159.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-392-1024x543.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-392-768x407.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>float onLine(float position, float center, float lineWidth, float edgeWidth) {\n    float halfWidth = lineWidth \/ 2.0;\n    float edge0 = center - halfWidth - edgeWidth;\n    float edge1 = center - halfWidth;\n    float edge2 = center + halfWidth;\n    float edge3 = center + halfWidth + edgeWidth;\n\n    return smoothstep(edge0, edge1, position) - smoothstep(edge2, edge3, position);\n}<\/code><\/pre>\n\n\n\n<p>\u4e0a\u9762\u4ee3\u7801\u4e2d\uff0c\u4f20\u5165\u7684\u53c2\u6570\u90fd\u5df2\u7ecf\u5f52\u4e00\u5316 [0,1]\u3002position \u662f\u8003\u5bdf\u7684\u70b9\u7684\u4f4d\u7f6e\uff0ccenter \u662f\u7ebf\u7684\u4e2d\u5fc3\u4f4d\u7f6e\uff0clineWidth \u662f\u7ebf\u7684\u5b9e\u9645\u5bbd\u5ea6\uff0cedgeWidth \u662f\u8fb9\u7f18\u7684\u5bbd\u5ea6\uff0c\u7528\u4e8e\u5e73\u6ed1\u8fc7\u6e21\u3002\u6211\u5b9e\u5728\u5bf9\u6211\u7684\u8868\u8fbe\u80fd\u529b\u611f\u5230\u4e0d\u60a6\uff01\u81f3\u4e8e\u600e\u4e48\u7b97\u7684\uff0c\u6211\u7ed9\u5927\u5bb6\u753b\u4e2a\u56fe\u7406\u89e3\u5427\uff01<\/p>\n\n\n\n<p>\u5927\u6982\u5c31\u662f\uff1a\uff0c \uff0c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-396.png\" alt=\"img\" class=\"wp-image-1541 lazyload\"\/><noscript><img decoding=\"async\" width=\"1108\" height=\"434\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-396.png\" alt=\"img\" class=\"wp-image-1541 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-396.png 1108w, https:\/\/remoooo.com\/wp-content\/uploads\/image-396-300x118.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-396-1024x401.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-396-768x301.png 768w\" sizes=\"(max-width: 1108px) 100vw, 1108px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u601d\u8003\u4e00\u4e0b\uff0c\u600e\u4e48\u753b\u4e00\u4e2a\u5e73\u6ed1\u8fc7\u6e21\u7684\u5706\u3002<\/p>\n\n\n\n<p>\u5bf9\u4e8e\u6bcf\u4e2a\u70b9\uff0c\u5148\u8ba1\u7b97\u4e0e\u5706\u5fc3\u7684\u8ddd\u79bb\u5411\u91cf\uff0c\u7ed3\u679c\u8fd4\u56de\u7ed9 position \uff0c\u5e76\u4e14\u8ba1\u7b97\u5176\u957f\u5ea6\u8fd4\u56de\u7ed9 len \u3002<\/p>\n\n\n\n<p>\u6a21\u4eff\u4e0a\u9762\u4e24\u4e2a smoothstep \u505a\u5dee\u7684\u65b9\u6cd5\uff0c\u901a\u8fc7\u51cf\u53bb\u5916\u8fb9\u7f18\u63d2\u503c\u7ed3\u679c\u6765\u751f\u6210\u4e00\u4e2a\u73af\u5f62\u7684\u7ebf\u6761\u6548\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float circle(float2 position, float2 center, float radius, float lineWidth, float edgeWidth){\n    position -= center;\n    float len = length(position);\n    \/\/Change true to false to soften the edge\n    float result = smoothstep(radius - lineWidth \/ 2.0 - edgeWidth, radius - lineWidth \/ 2.0, len) - smoothstep(radius + lineWidth \/ 2.0, radius + lineWidth \/ 2.0 + edgeWidth, len);\n\n    return result;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-402.png\" alt=\"img\" class=\"wp-image-1547 lazyload\"\/><noscript><img decoding=\"async\" width=\"942\" height=\"574\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-402.png\" alt=\"img\" class=\"wp-image-1547 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-402.png 942w, https:\/\/remoooo.com\/wp-content\/uploads\/image-402-300x183.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-402-768x468.png 768w\" sizes=\"(max-width: 942px) 100vw, 942px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">10. \u626b\u63cf\u7ebf\u6548\u679c<\/h3>\n\n\n\n<p>\u7136\u540e\u4e00\u6761\u6a2a\u7ebf\u3001\u4e00\u6761\u7ad6\u7ebf\uff0c\u5957\u5a03\u51e0\u4e2a\u5706\uff0c\u505a\u4e00\u4e2a\u96f7\u8fbe\u626b\u63cf\u7684\u6548\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float3 color = float3(0.0f,0.0f,0.0f);\ncolor += onLine(uv.y, center.y, 0.002, 0.001) * axisColor.rgb;\/\/xAxis\ncolor += onLine(uv.x, center.x, 0.002, 0.001) * axisColor.rgb;\/\/yAxis\ncolor += circle(uv, center, 0.2f, 0.002, 0.001) * axisColor.rgb;\ncolor += circle(uv, center, 0.3f, 0.002, 0.001) * axisColor.rgb;\ncolor += circle(uv, center, 0.4f, 0.002, 0.001) * axisColor.rgb;<\/code><\/pre>\n\n\n\n<p>\u518d\u753b\u4e00\u4e2a\u626b\u63cf\u7ebf\uff0c\u5e76\u4e14\u5e26\u6709\u8f68\u8ff9\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float sweep(float2 position, float2 center, float radius, float lineWidth, float edgeWidth) {\n    float2 direction = position - center;\n    float theta = time + 6.3;\n    float2 circlePoint = float2(cos(theta), -sin(theta)) * radius;\n    float projection = clamp(dot(direction, circlePoint) \/ dot(circlePoint, circlePoint), 0.0, 1.0);\n    float lineDistance = length(direction - circlePoint * projection);\n\n    float gradient = 0.0;\n    const float maxGradientAngle = PI * 0.5;\n\n    if (length(direction) &lt; radius) {\n        float angle = fmod(theta + atan2(direction.y, direction.x), PI2);\n        gradient = clamp(maxGradientAngle - angle, 0.0, maxGradientAngle) \/ maxGradientAngle * 0.5;\n    }\n\n    return gradient + 1.0 - smoothstep(lineWidth, lineWidth + edgeWidth, lineDistance);\n}<\/code><\/pre>\n\n\n\n<p>\u6dfb\u52a0\u5230\u989c\u8272\u4e2d\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\ncolor += sweep(uv, center, 0.45f, 0.003, 0.001) * sweepColor.rgb;\n...<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-399.png\" alt=\"img\" class=\"wp-image-1544 lazyload\"\/><noscript><img decoding=\"async\" width=\"1098\" height=\"546\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-399.png\" alt=\"img\" class=\"wp-image-1544 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-399.png 1098w, https:\/\/remoooo.com\/wp-content\/uploads\/image-399-300x149.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-399-1024x509.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-399-768x382.png 768w\" sizes=\"(max-width: 1098px) 100vw, 1098px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5f53\u524d\u7248\u672c\u4ee3\u7801\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compute Shader\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_HUDOverlay\/Assets\/Shaders\/HUDOverlay.compute<\/li>\n\n\n\n<li>CPU\uff1ahttps:\/\/github.com\/Remyuu\/Unity-Compute-Shader-Learn\/blob\/L3_HUDOverlay\/Assets\/Scripts\/HUDOverlay.cs<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">11. \u6e10\u53d8\u80cc\u666f\u9634\u5f71\u6548\u679c<\/h3>\n\n\n\n<p>\u8fd9\u4e2a\u6548\u679c\u53ef\u4ee5\u7528\u5728\u5b57\u5e55\u6216\u8005\u662f\u4e00\u4e9b\u8bf4\u660e\u6027\u6587\u5b57\u4e4b\u4e0b\u3002\u867d\u7136\u53ef\u4ee5\u76f4\u63a5\u5728UI Canvas\u4e2d\u52a0\u4e00\u5f20\u8d34\u56fe\uff0c\u4f46\u662f\u4f7f\u7528Compute Shader\u53ef\u4ee5\u5b9e\u73b0\u66f4\u52a0\u7075\u6d3b\u7684\u6548\u679c\u4ee5\u53ca\u8d44\u6e90\u7684\u4f18\u5316\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-397.png\" alt=\"img\" class=\"wp-image-1542 lazyload\"\/><noscript><img decoding=\"async\" width=\"936\" height=\"354\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-397.png\" alt=\"img\" class=\"wp-image-1542 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-397.png 936w, https:\/\/remoooo.com\/wp-content\/uploads\/image-397-300x113.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-397-768x290.png 768w\" sizes=\"(max-width: 936px) 100vw, 936px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u5b57\u5e55\u3001\u5bf9\u8bdd\u6587\u5b57\u80cc\u666f\u4e00\u822c\u90fd\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4e0a\u65b9\u4e0d\u4f5c\u5904\u7406\u3002\u540c\u65f6\u9700\u8981\u8f83\u9ad8\u7684\u5bf9\u6bd4\u5ea6\uff0c\u56e0\u6b64\u5bf9\u539f\u6709\u753b\u9762\u505a\u4e00\u4e2a\u7070\u5ea6\u5904\u7406\u3001\u5e76\u4e14\u6307\u5b9a\u4e00\u4e2a\u9634\u5f71\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (id.y&lt;(uint)tintHeight){\n    float3 grayScale = (srcColor.r + srcColor.g + srcColor.b) * 0.33 * tintColor.rgb;\n    float3 shaded = lerp(srcColor.rgb, grayScale, tintStrength) * shade;\n    ... \/\/ \u63a5\u4e0b\u6587\n}else{\n    color = srcColor;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-404.png\" alt=\"img\" class=\"wp-image-1549 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"621\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-404.png\" alt=\"img\" class=\"wp-image-1549 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-404.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-404-300x129.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-404-1024x442.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-404-768x331.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u6e10\u53d8\u6548\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\/\/ \u63a5\u4e0a\u6587\n    float srcAmount = smoothstep(tintHeight-edgeWidth, (float)tintHeight, (float)id.y);\n    ...\/\/ \u63a5\u4e0b\u6587<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-401.png\" alt=\"img\" class=\"wp-image-1546 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"622\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-401.png\" alt=\"img\" class=\"wp-image-1546 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-401.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-401-300x130.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-401-1024x442.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-401-768x332.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>\u6700\u540e\u518dlerp\u8d77\u6765\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\/\/ \u63a5\u4e0a\u6587\n    color = lerp(float4(shaded, 1), srcColor, srcAmount);<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-411.png\" alt=\"img\" class=\"wp-image-1556 lazyload\"\/><noscript><img decoding=\"async\" width=\"1420\" height=\"668\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-411.png\" alt=\"img\" class=\"wp-image-1556 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-411.png 1420w, https:\/\/remoooo.com\/wp-content\/uploads\/image-411-300x141.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-411-1024x482.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-411-768x361.png 768w\" sizes=\"(max-width: 1420px) 100vw, 1420px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">12. \u603b\u7ed3\/\u5c0f\u6d4b\u8bd5<\/h3>\n\n\n\n<p>If id.xy = [ 100, 30 ]. What would be the return value of inCircle((float2)id.xy, float2(130, 40), 40, 0.1)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-400.png\" alt=\"img\" class=\"wp-image-1545 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"377\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-400.png\" alt=\"img\" class=\"wp-image-1545 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-400.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-400-300x79.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-400-1024x268.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-400-768x201.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>When creating a blur effect which answer describes our approach best?<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-398.png\" alt=\"img\" class=\"wp-image-1543 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"373\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-398.png\" alt=\"img\" class=\"wp-image-1543 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-398.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-398-300x78.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-398-1024x265.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-398-768x199.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>Which answer would create a blocky low resolution version of the source image?<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-405.png\" alt=\"img\" class=\"wp-image-1550 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"446\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-405.png\" alt=\"img\" class=\"wp-image-1550 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-405.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-405-300x93.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-405-1024x317.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-405-768x238.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>What is smoothstep(5, 10, 6); ?<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-406.png\" alt=\"img\" class=\"wp-image-1551 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"365\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-406.png\" alt=\"img\" class=\"wp-image-1551 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-406.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-406-300x76.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-406-1024x260.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-406-768x195.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>If an and b are both vectors. Which answer best describes dot(a,b)\/dot(b,b); ?<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-407.png\" alt=\"img\" class=\"wp-image-1552 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"372\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-407.png\" alt=\"img\" class=\"wp-image-1552 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-407.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-407-300x78.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-407-1024x265.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-407-768x198.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>What is _MainTex_TexelSize.x? If _MainTex is 512 x 256 pixel resolution.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-408.png\" alt=\"img\" class=\"wp-image-1553 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"366\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-408.png\" alt=\"img\" class=\"wp-image-1553 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-408.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-408-300x76.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-408-1024x260.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-408-768x195.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">13. \u5229\u7528Blit\u7ed3\u5408Material\u505a\u540e\u5904\u7406<\/h3>\n\n\n\n<p>\u9664\u4e86\u4f7f\u7528Compute Shader\u5236\u4f5c\u540e\u5904\u7406\uff0c\u8fd8\u6709\u4e00\u79cd\u7b80\u5355\u7684\u65b9\u6cd5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ .cs\nGraphics.Blit(source, dest, material, passIndex);\n\/\/ .shader\nPass{\n    CGPROGRAM\n    #pragma vertex vert_img\n    #pragma fragment frag\n    fixed4 frag(v2f_img input) : SV_Target{\n        return tex2D(_MainTex, input.uv);\n    }\n    ENDCG\n}<\/code><\/pre>\n\n\n\n<p>\u901a\u8fc7\u7ed3\u5408Shader\u6765\u5904\u7406\u56fe\u50cf\u6570\u636e\u3002<\/p>\n\n\n\n<p>\u90a3\u4e48\u95ee\u9898\u6765\u4e86\uff0c\u4e24\u8005\u6709\u4ec0\u4e48\u533a\u522b\uff1f\u800c\u4e14\u4f20\u8fdb\u6765\u7684\u4e0d\u662f\u4e00\u5f20\u7eb9\u7406\u5417\uff0c\u54ea\u6765\u7684\u9876\u70b9\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a<\/p>\n\n\n\n<p>\u7b2c\u4e00\u4e2a\u95ee\u9898\u3002\u8fd9\u79cd\u65b9\u6cd5\u79f0\u4e3a\u201c\u5c4f\u5e55\u7a7a\u95f4\u7740\u8272\u201d\uff0c\u5b8c\u5168\u96c6\u6210\u5728Unity\u7684\u56fe\u5f62\u7ba1\u7ebf\u4e2d\uff0c\u6027\u80fd\u5176\u5b9e\u6bd4Compute Shader\u66f4\u9ad8\u3002\u800cCompute Shader\u63d0\u4f9b\u4e86\u5bf9GPU\u8d44\u6e90\u7684\u66f4\u7ec6\u7c92\u5ea6\u63a7\u5236\u3002\u5b83\u4e0d\u53d7\u56fe\u5f62\u7ba1\u7ebf\u7684\u9650\u5236\uff0c\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u548c\u4fee\u6539\u7eb9\u7406\u3001\u7f13\u51b2\u533a\u7b49\u8d44\u6e90\u3002<\/p>\n\n\n\n<p>\u7b2c\u4e8c\u4e2a\u95ee\u9898\u3002\u6ce8\u610f\u770b vert_img \u3002\u5728UnityCG\u4e2d\u53ef\u4ee5\u627e\u5230\u5982\u4e0b\u5b9a\u4e49\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-409.png\" alt=\"img\" class=\"wp-image-1554 lazyload\"\/><noscript><img decoding=\"async\" width=\"1218\" height=\"436\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-409.png\" alt=\"img\" class=\"wp-image-1554 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-409.png 1218w, https:\/\/remoooo.com\/wp-content\/uploads\/image-409-300x107.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-409-1024x367.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-409-768x275.png 768w\" sizes=\"(max-width: 1218px) 100vw, 1218px\" \/><\/noscript><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" data-src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-410.png\" alt=\"img\" class=\"wp-image-1555 lazyload\"\/><noscript><img decoding=\"async\" width=\"1440\" height=\"517\" src=\"https:\/\/\u80a5\u80a5.com\/wp-content\/uploads\/image-410.png\" alt=\"img\" class=\"wp-image-1555 lazyload\" srcset=\"https:\/\/remoooo.com\/wp-content\/uploads\/image-410.png 1440w, https:\/\/remoooo.com\/wp-content\/uploads\/image-410-300x108.png 300w, https:\/\/remoooo.com\/wp-content\/uploads\/image-410-1024x368.png 1024w, https:\/\/remoooo.com\/wp-content\/uploads\/image-410-768x276.png 768w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/figure>\n\n\n\n<p>Unity\u4f1a\u81ea\u52a8\u5c06\u4f20\u8fdb\u6765\u7684\u7eb9\u7406\u81ea\u52a8\u8f6c\u6362\u4e3a\u4e24\u4e2a\u4e09\u89d2\u5f62\uff08\u4e00\u4e2a\u5145\u6ee1\u5c4f\u5e55\u7684\u77e9\u5f62\uff09\uff0c\u6211\u4eec\u7528\u6750\u8d28\u7684\u65b9\u6cd5\u7f16\u5199\u540e\u5904\u7406\u65f6\u76f4\u63a5\u5728frag\u4e0a\u5199\u5c31\u597d\u4e86\u3002<\/p>\n\n\n\n<p>\u4e0b\u4e00\u7ae0\u5c06\u4f1a\u5b66\u4e60\u5982\u4f55\u5c06Material\u3001Shader\u3001Compute Shader\u8fd8\u6709C#\u8054\u7cfb\u8d77\u6765\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u521d\u6b65\u8ba4\u8bc6\u4e86Compute Shader\uff0c\u5b9e\u73b0\u4e00\u4e9b\u7b80\u5355\u7684\u6548\u679c\u3002\u6240\u6709\u7684\u4ee3\u7801\u90fd\u5728\uff1a https:\/\/githu [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1519,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[74,37],"class_list":["post-1513","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech","tag-compute-shader","tag-unity"],"_links":{"self":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/1513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/comments?post=1513"}],"version-history":[{"count":1,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/1513\/revisions"}],"predecessor-version":[{"id":1557,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/posts\/1513\/revisions\/1557"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/media\/1519"}],"wp:attachment":[{"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/media?parent=1513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/categories?post=1513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remoooo.com\/en\/wp-json\/wp\/v2\/tags?post=1513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}