{"id":2653,"date":"2022-12-24T15:02:17","date_gmt":"2022-12-24T07:02:17","guid":{"rendered":"https:\/\/www.caiqinyi.cn\/?p=2653"},"modified":"2025-02-26T11:14:13","modified_gmt":"2025-02-26T03:14:13","slug":"tangent_space_normal_mapping","status":"publish","type":"post","link":"https:\/\/www.caiqinyi.cn\/index.php\/2022\/12\/24\/tangent_space_normal_mapping\/","title":{"rendered":"\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u8d34\u56fe"},"content":{"rendered":"<p><script type=\"text\/javascript\" async src=\"https:\/\/www.caiqinyi.cn\/wp-content\/MathJax\/MathJax.js?config=TeX-AMS_CHTML\">\n<\/script><br \/>\n<script type=\"text\/x-mathjax-config\">\n    MathJax.Hub.Config({\n        tex2jax: {inlineMath: [['$','$']]},\n        TeX: {equationNumbers: {autoNumber: [\"AMS\"], useLabelIds: true}},\n        \"HTML-CSS\": {linebreaks: {automatic: true}},\n        SVG: {linebreaks: {automatic: true}}\n    });\n<\/script><\/p>\n<p>\u4e0d\u51fa\u610f\u5916\u5730, \u81ea\u5df1\u4e8e\u4e0a\u5468\u516d\u8fdb\u5316\u6210\u4e86\u4e00\u4e2a\u5c0f\u9633\u4eba, \u5e76\u5df2\u5c45\u5bb6\u529e\u516c\u4e86\u4e00\u5468. \u4e00\u5468\u4ee5\u6765, \u867d\u7136\u514d\u53bb\u4e86\u901a\u52e4\u7684\u75db\u82e6, \u4f46\u8eab\u4f53\u4e0a\u7684\u75c5\u75db\u4e0e\u9700\u8981\u81ea\u5df1\u89c5\u98df\u7684\u96be\u5904\u4e5f\u8ba9\u81ea\u5df1Emo\u4e86\u4e0d\u5c11. \u76ee\u524d, \u8eab\u4f53\u72b6\u6001\u5df2\u7ecf\u6062\u590d\u4e86\u4e0d\u5c11\u4e86, \u6545\u8d81\u8fd9\u51e0\u5929\u5de5\u4f5c\u8282\u594f\u6bd4\u8f83\u8f7b\u677e\u7684\u65f6\u5019, \u8bb0\u5f55\u4e00\u4e0b\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u8d34\u56fe\u7684\u76f8\u5173\u77e5\u8bc6\u70b9.<\/p>\n<p><!--more--><\/p>\n<p><strong>\u53c2\u8003\u6750\u6599<\/strong><br \/>\n1. <a href=\"https:\/\/github.com\/ssloy\/tinyrenderer\/wiki\/Lesson-6bis:-tangent-space-normal-mapping\">Lesson 6bis: tangent space normal mapping<\/a><br \/>\n2. <a href=\"https:\/\/learnopengl-cn.github.io\/05%20Advanced%20Lighting\/04%20Normal%20Mapping\/\">\u6cd5\u7ebf\u8d34\u56fe<\/a><br \/>\n3. <a href=\"https:\/\/zhuanlan.zhihu.com\/p\/139593847\">\u5207\u7ebf\u7a7a\u95f4\uff08Tangent Space\uff09\u5b8c\u5168\u89e3\u6790<\/a><\/p>\n<p>\u81ea\u5df1\u4e00\u5f00\u59cb\u662f\u5728learnopengl\u4e0a\u4e86\u89e3\u5230\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u8d34\u56fe\u7684, \u4f46\u5176\u8bb2\u89e3\u4e00\u76f4\u8ba9\u6211\u4e91\u91cc\u96fe\u91cc. \u76f4\u5230\u5b66\u4e60\u4e86tinyrenderer\u7684\u7b2c6\u8282\u8bfe, \u81ea\u5df1\u624d\u7b97\u771f\u6b63\u5730\u638c\u63e1\u4e86\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u8d34\u56fe.<\/p>\n<p><strong>1. \u5f00\u7bc7<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/grid_texture.png\" alt=\"\" width=\"798\" height=\"504\" class=\"aligncenter size-full wp-image-2657\" srcset=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/grid_texture.png 798w, https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/grid_texture-300x189.png 300w, https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/grid_texture-768x485.png 768w\" sizes=\"(max-width: 798px) 100vw, 798px\" \/><\/p>\n<p>\u5bf9\u4e8e\u4e00\u4e2a\u4e09\u89d2\u5f62\u7684\u6bcf\u4e2a\u9876\u70b9, \u6211\u4eec\u5df2\u77e5\u5176\u5750\u6807$p$, \u7eb9\u7406\u5750\u6807$uv$\u4e0e\u6cd5\u7ebf. \u5bf9\u4e8e\u5f85\u6e32\u67d3\u7684\u5f53\u524d\u50cf\u7d20, \u8f6f\u5149\u6805\u5668\u7ed9\u51fa\u4e86\u5176\u91cd\u5fc3\u5750\u6807($\\alpha, \\beta, \\gamma$). \u8fd9\u610f\u5473\u7740\u4e09\u89d2\u5f62\u5185\u4efb\u4e00\u70b9\u7684\u5750\u6807$p$\u5747\u53ef\u4ee5\u7531$p = \\alpha p_0 + \\beta p_1 + \\gamma p_2$\u5f97\u5230. \u540c\u7406\u53ef\u5f97:$$ u = \\alpha u_0 + \\beta u_1 + \\gamma u_2, \\\\ v = \\alpha v_0 + \\beta v_1 + \\gamma v_2, \\\\ \\vec{n} = \\alpha \\vec{n}_0 + \\beta \\vec{n}_1 + \\gamma \\vec{n}_2.$$<strong>\u800c\u4ee5$UV$\u7a7a\u95f4\u4e2d\u7684$U$\u8f74\u4e0e$V$\u8f74\u4e3a\u4e24\u4e2a\u5750\u6807\u8f74, \u5373\u53ef\u6784\u9020\u51fa\u5207\u7ebf\u7a7a\u95f4.<\/strong><\/p>\n<p><strong>2. \u5982\u4f55\u4ece3\u4e2a\u6837\u672c\u70b9\u91cd\u5efa\u4e00\u4e2a3\u7ef4\u7ebf\u6027\u51fd\u6570<\/strong><\/p>\n<p>\u63a5\u4e0b\u6765, \u6211\u4eec\u7684\u76ee\u6807\u662f\u8981\u4e3a\u5f85\u6e32\u67d3\u7684\u6bcf\u4e2a\u50cf\u7d20\u8ba1\u7b972\u4e2a\u5411\u91cf(\u5206\u522b\u4e3a\u5207\u5411\u91cf\u4e0e\u526f\u5207\u5411\u91cf). \u5047\u8bbe\u7ed9\u5b9a\u4e86\u4e00\u4e2a\u5b9a\u4e49\u5728\u4e09\u89d2\u5f62$T$\u4e0a\u7684\u9ad8\u5ea6\u51fd\u6570$f$, s.t. $$f(x, y, z) = Ax + By + Cz + D,$$\u5176\u4e2d, $\\forall (x, y, z) \\in T$. \u5c3d\u7ba1\u5e76\u4e0d\u6e05\u695a$A, B, C$\u4e0e$D$\u7684\u503c, \u4f46\u53ef\u4ee5\u51c6\u786e\u77e5\u9053\u9ad8\u5ea6\u51fd\u6570$f$\u5728\u4e09\u89d2\u5f62$T$\u4e0a\u7684\u4e09\u4e2a\u9876\u70b9$p_0, p_1, p_2$\u4e0a\u7684\u53d6\u503c:$$f(x, y, z) = Ax + By + Cz + D : \\left\\{\\begin{matrix}<br \/>\nf(p_0) = f_0, \\\\<br \/>\nf(p_1) = f_1, \\\\<br \/>\nf(p_2) = f_2.<br \/>\n\\end{matrix}\\right.$$<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_a.png\" alt=\"\" width=\"381\" height=\"241\" class=\"aligncenter size-full wp-image-2670\" srcset=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_a.png 381w, https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_a-300x190.png 300w\" sizes=\"(max-width: 381px) 100vw, 381px\" \/><\/p>\n<p>\u4e0d\u59a8\u628a\u9ad8\u5ea6\u51fd\u6570$f$\u60f3\u8c61\u6210\u4e00\u4e2a\u659c\u9762\u7684\u9ad8\u5ea6\u56fe, \u5982\u4e0a\u56fe\u6240\u793a. \u6211\u4eec\u5728\u5e73\u9762\u4e0a\u56fa\u5b9a3\u4e2a\u4e0d\u540c\u7684(\u975e\u5171\u7ebf\u7684)\u70b9, \u5e76\u4e14\u6211\u4eec\u77e5\u9053\u8fd9\u4e9b\u70b9\u7684$f$\u503c. \u4e09\u89d2\u5f62\u5185\u7684\u7ea2\u7ebf\u5206\u522b\u8868\u793a\u5bf9\u5e94\u4e8e$f_0$, $f_0 + 1$, $f_0 + 2$\u7b49\u7684\u7b49\u503c\u7ebf. \u5bf9\u4e8e\u7ebf\u6027\u51fd\u6570\u800c\u8a00, \u7b49\u503c\u7ebf\u662f\u76f8\u4e92\u5e73\u884c\u7684.<br \/>\n$\\\\$ \u5b9e\u9645\u4e0a, \u6211\u4eec\u5bf9\u5782\u76f4\u4e8e\u7b49\u503c\u7ebf\u7684\u65b9\u5411\u66f4\u611f\u5174\u8da3. \u82e5\u6211\u4eec\u6cbf\u7740\u7b49\u503c\u7ebf\u79fb\u52a8, \u5176\u9ad8\u5ea6\u503c\u662f\u4e0d\u4f1a\u53d1\u751f\u6539\u53d8\u7684. \u4f46\u5982\u82e5\u6211\u4eec\u7a0d\u5fae\u504f\u79bb\u4e86\u5f53\u524d\u6240\u5728\u7684\u7b49\u503c\u7ebf, \u5219\u5176\u9ad8\u5ea6\u503c\u4ea6\u4f1a\u4ea7\u751f\u4e00\u4e9b\u53d8\u5316. \u5f53\u6211\u4eec\u6cbf\u7740\u4e0e\u7b49\u503c\u7ebf\u5782\u76f4\u7684\u65b9\u5411\u79fb\u52a8\u65f6, \u5219\u6211\u4eec\u4e5f\u5f97\u5230\u4e86\u4e00\u4e2a\u9ad8\u5ea6\u503c\u53d8\u5316\u6700\u5feb\u7684\u65b9\u5411.<br \/>\n$\\\\$ \u663e\u7136, \u4e00\u4e2a\u51fd\u6570\u7684\u503c\u589e\u52a0\u6700\u5feb\u7684\u65b9\u5411\u4fbf\u662f\u5176\u68af\u5ea6\u65b9\u5411. \u5bf9\u4e8e\u4e00\u4e2a\u7ebf\u6027\u51fd\u6570$f(x, y, $$ z) = Ax + By + Cz + D$\u800c\u8a00, \u5176\u68af\u5ea6\u4e3a\u4e00\u4e2a\u5e38\u5411\u91cf$(A, B, C)$. \u7531\u4e8e\u6211\u4eec\u5e76\u4e0d\u77e5\u9053$(A, B, C)$\u7684\u503c, \u63a5\u4e0b\u6765\u6211\u4eec\u4fbf\u8981\u4ece\u9ad8\u5ea6\u51fd\u6570$f$\u76843\u4e2a\u6837\u672c\u70b9\u51fa\u53d1, \u63a8\u5bfc\u51fa$A, B$\u4e0e$C$\u7684\u503c.<br \/>\n$\\\\$ \u6211\u4eec\u5df2\u77e53\u4e2a\u70b9$p_0, p_1, p_2$\u4e0e\u5bf9\u5e94\u76843\u4e2a\u9ad8\u5ea6\u503c$f_0, f_1, f_2$. \u6211\u4eec\u9700\u8981\u627e\u5230\u9ad8\u5ea6\u51fd\u6570$f$\u7684\u68af\u5ea6\u5411\u91cf$(A, B, C)$. \u4e0d\u59a8\u8003\u8651\u53e6\u4e00\u4e2a\u51fd\u6570$g$, \u5176\u5b9a\u4e49\u4e3a$g(p) = f(p) &#8211; f(p_0)$.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_b.png\" alt=\"\" width=\"433\" height=\"241\" class=\"aligncenter size-full wp-image-2677\" srcset=\"https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_b.png 433w, https:\/\/www.caiqinyi.cn\/wp-content\/uploads\/2022\/12\/gradient_b-300x167.png 300w\" sizes=\"(max-width: 433px) 100vw, 433px\" \/><\/p>\n<p>\u663e\u7136, \u6211\u4eec\u53ea\u662f\u5e73\u79fb\u4e86\u659c\u9762, \u4f46\u5e76\u6ca1\u6709\u6539\u53d8\u659c\u9762\u7684\u503e\u659c\u89d2\uff0c\u56e0\u6b64, \u9ad8\u5ea6\u51fd\u6570$f$\u548c$g$\u7684\u68af\u5ea6\u65b9\u5411\u662f\u76f8\u540c\u7684. \u63a5\u4e0b\u6765, \u5c06\u9ad8\u5ea6\u51fd\u6570$g$\u91cd\u5b9a\u4e49\u5982\u4e0b:$$g(p) = f(p) &#8211; f(p_0) = (p^x \\ p^y \\ p^z \\ 1) \\begin{pmatrix}<br \/>\nA \\\\<br \/>\nB \\\\<br \/>\nC \\\\<br \/>\nD<br \/>\n\\end{pmatrix} &#8211; (p^x_0 \\ p^y_0 \\ p^z_0 \\ 1) \\begin{pmatrix}<br \/>\nA \\\\<br \/>\nB \\\\<br \/>\nC \\\\<br \/>\nD<br \/>\n\\end{pmatrix} \\\\ = \\overrightarrow{p_0 p} \\cdot (A \\ B \\ C).$$\u6545\u9ad8\u5ea6\u51fd\u6570$g$\u5373\u4e3a\u5411\u91cf$p &#8211; p_0$\u4e0e$(A, B, C)$\u7684\u5185\u79ef. \u82e5\u4ece$p_0$\u53d8\u5316\u81f3$p_2$, \u5219\u51fd\u6570$g$\u4f1a\u4ece0\u53d8\u5316\u81f3$f_2 &#8211; f_0$. \u6362\u8a00\u4e4b, \u5411\u91cf$p_2 &#8211; p_0$\u4e0e$(A, B, C)$\u7684\u5185\u79ef\u4e3a$f_2 &#8211; f_0$. \u540c\u7406\u53ef\u5f97\u5411\u91cf$p_1 &#8211; p_0$\u4e0e$(A, B, C)$\u7684\u5185\u79ef\u4e3a$f_1 &#8211; f_0$. \u53c8$(A, B, C)$\u4e3a\u4e00\u4e2a\u68af\u5ea6\u5411\u91cf, \u82e5\u8bbe\u5176\u6cd5\u5411\u4e3a$\\vec{n}$, \u5219\u5176\u4e0e\u68af\u5ea6\u5411\u91cf$(A, B $$ , C)$\u7684\u5185\u79ef\u4e3a0:$$\\left\\{\\begin{matrix}<br \/>\n\\overrightarrow{p_0 p_1} \\cdot (A \\ B \\ C) = f_1 &#8211; f_0, \\\\<br \/>\n\\overrightarrow{p_0 p_2} \\cdot (A \\ B \\ C) = f_2 &#8211; f_0, \\\\<br \/>\n\\vec{n} \\cdot (A \\ B \\ C) = 0.<br \/>\n\\end{matrix}\\right.$$\u5c06\u4e0a\u5f0f\u5199\u4e3a\u77e9\u9635\u7684\u5f62\u5f0f:$$\\begin{pmatrix}<br \/>\n(\\overrightarrow{p_0 p_1})^x &#038; (\\overrightarrow{p_0 p_1})^y &#038; (\\overrightarrow{p_0 p_1})^z \\\\<br \/>\n(\\overrightarrow{p_0 p_2})^x &#038; (\\overrightarrow{p_0 p_2})^y &#038; (\\overrightarrow{p_0 p_2})^z \\\\<br \/>\n(\\vec{n})^x &#038; (\\vec{n})^y &#038; (\\vec{n})^z<br \/>\n\\end{pmatrix}\\begin{pmatrix}<br \/>\nA \\\\<br \/>\nB \\\\<br \/>\nC<br \/>\n\\end{pmatrix} = \\begin{pmatrix}<br \/>\nf_1 &#8211; f_0 \\\\<br \/>\nf_2 &#8211; f_0 \\\\<br \/>\n0<br \/>\n\\end{pmatrix}.$$\u6700\u7ec8, \u6211\u4eec\u5f97\u5230\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u7ebf\u6027\u65b9\u7a0b:$$M \\vec{x} = \\vec{b} \\Rightarrow \\vec{x} = M^{-1} \\vec{b}.$$\u663e\u7136, \u77e9\u9635$M$\u4e0e\u9ad8\u5ea6\u51fd\u6570$f$\u5e76\u65e0\u5173\u7cfb, \u5b83\u88ab\u4e09\u89d2\u5f62\u672c\u8eab\u552f\u4e00\u786e\u5b9a.<\/p>\n<p><strong>3. \u8ba1\u7b97\u8fbe\u5e03\u57fa\u5e76\u5e94\u7528\u6cd5\u5411\u7684\u6444\u52a8<\/strong><\/p>\n<p>\u8fbe\u5e03\u57fa\u662f\u4e00\u4e2a\u4e09\u5143\u7ec4$(\\vec{i}, \\vec{j}, \\vec{n})$, \u5176\u4e2d, $\\vec{n}$\u4e3a\u7ecf\u91cd\u5fc3\u5750\u6807\u63d2\u503c\u5f97\u5230\u7684\u6cd5\u5411, $\\vec{i}, \\vec{j}$\u5219\u53ef\u901a\u8fc7\u5982\u4e0b\u5f0f\u5b50\u8fdb\u884c\u8ba1\u7b97:$$\\vec{i} = M^{-1} \\begin{pmatrix}<br \/>\nu_1 &#8211; u_0 \\\\<br \/>\nu_2 &#8211; u_0 \\\\<br \/>\n0<br \/>\n\\end{pmatrix}, \\\\ \\vec{j} = M^{-1} \\begin{pmatrix}<br \/>\nv_1 &#8211; v_0 \\\\<br \/>\nv_2 &#8211; v_0 \\\\<br \/>\n0<br \/>\n\\end{pmatrix}.$$\u5982\u6b64\u4e00\u6765, \u5c06$\\vec{i}, \\vec{j}$\u4e0e\u6cd5\u5411$\\vec{n}$\u5217\u6392\u5f97\u5230\u7684\u53d8\u6362\u77e9\u9635$M&#8217;$(\u53c8\u79f0TBN\u77e9\u9635), \u4fbf\u53ef\u5c06\u5207\u7ebf\u7a7a\u95f4\u4e2d\u7684\u5411\u91cf\u53d8\u6362\u81f3\u4e16\u754c\u7a7a\u95f4\u4e2d.<br \/>\n$\\\\$ \u9700\u8981\u6ce8\u610f\u7684\u662f, $p_i$\u901a\u5e38\u53d6\u7ecf\u900f\u89c6\u9664\u6cd5\u540e\u7684\u5c4f\u5e55\u5750\u6807, \u800c\u6cd5\u5411$\\vec{n}$\u6240\u5728\u7684\u7a7a\u95f4\u5e76\u65e0\u9650\u5236, \u53ea\u8981\u4e0e\u5149\u6e90\u7684\u4f4d\u7f6e\u5411\u91cf(\u76f8\u5bf9\u4e8e\u4e16\u754c\u7a7a\u95f4) \u6240\u5728\u7684\u7a7a\u95f4\u4fdd\u6301\u4e00\u81f4\u5373\u53ef. \u5982\u6b64\u4e00\u6765, \u540e\u7eed\u8fdb\u884c\u7684\u6cd5\u5411\u4e0e\u5149\u6e90\u7684\u4f4d\u7f6e\u5411\u91cf\u7684\u5185\u79ef\u8fd0\u7b97\u624d\u662f\u6709\u610f\u4e49\u7684.<\/p>\n<p><strong>4. \u76f8\u5173\u95ee\u9898<\/strong><\/p>\n<p>\u5bf9\u4e8e\u89c4\u8303\u7684TBN\u77e9\u9635\u800c\u8a00, TB\u4e8c\u8f74\u4e0eUV\u8f74\u65b9\u5411\u6781\u5927\u591a\u6570\u60c5\u51b5\u5f88\u53ef\u80fd\u5e76\u4e0d\u76f8\u540c. \u5f53\u9876\u70b9\u6cd5\u7ebf\u5728\u5efa\u6a21\u8f6f\u4ef6\u4e2d\u88ab\u4fee\u6539\u4e3a\u4e0d\u5782\u76f4\u4e8e\u8be5\u9762\u7247\u65f6, TB\u5e73\u9762\u751a\u81f3\u4e0d\u5728\u4e09\u89d2\u5f62\u9762\u7247\u4e0a; \u5f53UV\u7ecf\u8fc7\u62c9\u4f38\u65f6, \u56e0TB\u4e8c\u8f74\u5728\u6b63\u4ea4\u5316\u524d\u4e0eUV\u65b9\u5411\u76f8\u540c, \u6545\u6b63\u4ea4\u5316\u540eTB\u4e8c\u8f74\u5fc5\u7136\u4e0eUV\u65b9\u5411\u662f\u6709\u6240\u504f\u5dee\u7684, \u800c\u5bf9\u4e8e\u4e00\u4e2a\u591a\u9762\u7247\u7684\u6a21\u578bUV\u5c55\u5f00, \u8fd9\u79cd\u62c9\u4f38\u65cb\u8f6c\u7684\u60c5\u51b5\u7b80\u76f4\u53f8\u7a7a\u89c1\u60ef.<br \/>\n$\\\\$ \u6b64\u5916, TBN\u77e9\u9635\u5728VS\u4e2d\u6784\u5efa\u540e, PS\u4e2d\u7ecf\u8fc7\u63d2\u503c\u4e86\u5c31\u4e0d\u6b63\u4ea4\u4e86, \u4e00\u822c\u6765\u8bf4\u5e94\u8be5\u91cd\u65b0\u6b63\u4ea4\u5316. \u5982\u679c\u8ffd\u6c42\u7cbe\u5ea6\u7684\u8bdd, TBN\u77e9\u9635\u5e94\u5f53\u5728PS\u4e2d\u6784\u5efa, \u4e0d\u8fc7\u5b9e\u6d4b\u5373\u4fbf\u76f4\u63a5\u7528\u63d2\u503c\u540e\u7684\u77e9\u9635\u4e5f\u51e0\u4e4e\u6ca1\u6709\u4ec0\u4e48\u5dee\u522b, \u6bd5\u7adf\u6cd5\u7ebf\u5fae\u5c0f\u70b9\u9519\u4e86\u8c01\u4e5f\u770b\u4e0d\u51fa\u6765, \u6240\u4ee5\u6027\u80fd\u6743\u8861\u4e0bUnity\u7684URP\u7ba1\u7ebf\u5c31\u662f\u76f4\u63a5\u7528\u7684\u672a\u6b63\u4ea4\u7684\u63d2\u503c\u77e9\u9635.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0d\u51fa\u610f\u5916\u5730, \u81ea\u5df1\u4e8e\u4e0a\u5468\u516d\u8fdb\u5316\u6210\u4e86\u4e00\u4e2a\u5c0f\u9633\u4eba, \u5e76\u5df2\u5c45\u5bb6\u529e\u516c\u4e86\u4e00\u5468. \u4e00\u5468\u4ee5\u6765, \u867d\u7136\u514d\u53bb\u4e86\u901a\u52e4\u7684\u75db\u82e6, \u4f46\u8eab &hellip; <a href=\"https:\/\/www.caiqinyi.cn\/index.php\/2022\/12\/24\/tangent_space_normal_mapping\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u8d34\u56fe<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"_links":{"self":[{"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/posts\/2653"}],"collection":[{"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/comments?post=2653"}],"version-history":[{"count":48,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/posts\/2653\/revisions"}],"predecessor-version":[{"id":3619,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/posts\/2653\/revisions\/3619"}],"wp:attachment":[{"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/media?parent=2653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/categories?post=2653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.caiqinyi.cn\/index.php\/wp-json\/wp\/v2\/tags?post=2653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}