{"id":2626,"date":"2022-01-18T00:06:43","date_gmt":"2022-01-17T16:06:43","guid":{"rendered":"http:\/\/www.u3d8.com\/?p=2626"},"modified":"2022-01-18T00:06:45","modified_gmt":"2022-01-17T16:06:45","slug":"shader%e9%ab%98%e5%85%89%e5%8f%8d%e5%b0%84blinnphong","status":"publish","type":"post","link":"http:\/\/www.u3d8.com\/?p=2626","title":{"rendered":"Shader\u9ad8\u5149\u53cd\u5c04BlinnPhong"},"content":{"rendered":"\n<h2>\u5b9a\u4e49<\/h2>\n\n\n\n<p>1977\u5e74\uff0c\u4e00\u4e2a\u540d\u53ebJames F. Blinn\u7684\u4eba\u63d0\u51fa\u4e86\u53e6\u4e00\u79cd\u8ba1\u7b97\u955c\u9762\u9ad8\u5149\u7684\u65b9\u6cd5\u3002\u8fd0\u7528\u8fd9\u79cd\u65b9\u6cd5\u7684Phong\u5149\u7167\u6a21\u578b\u5c31\u79f0\u4e3aBlinn-Phong\u5149\u7167\u6a21\u578b\u3002\u4ece\u540d\u5b57\u4e0a\u5c31\u53ef\u4ee5\u770b\u51fa\uff0c\u8fd9\u79cd\u6a21\u578b\u5e76\u6ca1\u6709\u5bf9Phong\u6a21\u578b\u8fdb\u884c\u5927\u6539\u52a8\uff08\u5426\u5219\u5c31\u662fBlinn\u5149\u7167\u6a21\u578b\u4e86\uff09\u3002\u6ca1\u9519\uff0c\u5b83\u53ea\u662f\u5bf9\u8ba1\u7b97\u955c\u9762\u9ad8\u5149\u7684\u7b97\u6cd5\u8fdb\u884c\u4e86\u6539\u52a8\uff0c\u6362\u4e86\u4e00\u79cd\u955c\u9762\u9ad8\u5149\u7684\u8ba1\u7b97\u65b9\u6cd5\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/7822237-3abfb332a2c65f10.png\" data-lightbox=\"image_lg\"><img title=\"Shader\u9ad8\u5149\u53cd\u5c04BlinnPhong - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"Shader\u9ad8\u5149\u53cd\u5c04BlinnPhong - \u7b2c1\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" width=\"453\" height=\"322\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/7822237-3abfb332a2c65f10.png\" alt=\"\" class=\"wp-image-2627\" srcset=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/7822237-3abfb332a2c65f10.png 453w, http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/7822237-3abfb332a2c65f10-300x213.png 300w\" sizes=\"(max-width: 453px) 100vw, 453px\" \/><\/a><\/figure>\n\n\n\n<h2>\u516c\u5f0f<\/h2>\n\n\n\n<p>Specular = \u76f4\u5c04\u5149 * pow(max(0, cos\u03b8), \u9ad8\u5149\u53cd\u5c04\u53c2\u6570)<\/p>\n\n\n\n<p>\u03b8 = \u6cd5\u7ebf\u548ch\u7684\u5939\u89d2<\/p>\n\n\n\n<p>h = \u5e73\u884c\u5149\u4e0e\u89c6\u91ce\u65b9\u5411\u7684\u5e73\u5206\u7ebf<\/p>\n\n\n\n<h2>\u9876\u70b9\u8ba1\u7b97\/\u7247\u5143\u8ba1\u7b97<\/h2>\n\n\n\n<h3>\u6548\u679c<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/Snipaste_2022-01-18_00-04-53.jpg\" data-lightbox=\"image_lg\"><img title=\"Shader\u9ad8\u5149\u53cd\u5c04BlinnPhong - \u7b2c2\u5f20  | u3d8\u6280\u672f\u5206\u4eab\" alt=\"Shader\u9ad8\u5149\u53cd\u5c04BlinnPhong - \u7b2c2\u5f20  | u3d8\u6280\u672f\u5206\u4eab\"  loading=\"lazy\" width=\"635\" height=\"351\"  data-src=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/Snipaste_2022-01-18_00-04-53.jpg\" alt=\"\" class=\"wp-image-2629\" srcset=\"http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/Snipaste_2022-01-18_00-04-53.jpg 635w, http:\/\/www.u3d8.com\/wp-content\/uploads\/2022\/01\/Snipaste_2022-01-18_00-04-53-300x166.jpg 300w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/a><\/figure>\n\n\n\n<h3>\u9010\u9876\u70b9\u8ba1\u7b97<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Shader \"WCC\/Specular BlinnPhong Vertex\"{\r\n    Properties\r\n    {\r\n        _Diffuse (\"Diffuse\", Color) = (1, 1, 1, 1)\r\n        \/\/\u63a7\u5236\u9ad8\u5149\u53cd\u5c04\u989c\u8272\r\n        _Specular (\"Specular\", Color) = (1, 1, 1, 1)\r\n        \/\/\u63a7\u5236\u9ad8\u5149\u533a\u57df\u5927\u5c0f\r\n        _Gloss (\"Gloss\", Range(8.0, 256)) = 20\r\n    }\r\n    SubShader\r\n    {\r\n        Pass\r\n        {\r\n            Tags { \"LightMode\"=\"ForwardBase\" }\r\n \r\n            CGPROGRAM\r\n \r\n            #pragma vertex vert\r\n            #pragma fragment frag\r\n \r\n            #include \"Lighting.cginc\"\r\n \r\n            fixed4 _Diffuse;\r\n            fixed4 _Specular;\r\n            float _Gloss;\r\n \r\n            struct a2v\r\n            {\r\n                \/\/\u6a21\u578b\u7a7a\u95f4\u7684\u9876\u70b9\u5750\u6807\r\n                float4 vertex:POSITION;\r\n                \/\/\u6a21\u578b\u7a7a\u95f4\u7684\u6cd5\u7ebf\u65b9\u5411\r\n                float3 normal:NORMAL;\r\n \r\n            };\r\n \r\n            struct v2f\r\n            {\r\n                \/\/\u8f93\u51fa\u7684\u662f\u88c1\u526a\u7a7a\u95f4\u7684\u9876\u70b9\u5750\u6807\r\n                float4 pos:SV_POSITION;\r\n \r\n                float3 color:COLOR;\r\n \r\n            };\r\n \r\n            v2f vert(a2v v){\r\n                v2f o;\r\n \r\n                \/\/\u5229\u7528unity\u5185\u7f6e\u7684\u6a21\u578b-\u89c2\u5bdf-\u6295\u5f71\u77e9\u9635\u5c06\u9876\u70b9\u5750\u6807\u8f6c\u6362\u5230\u88c1\u526a\u7a7a\u95f4\r\n                o.pos=UnityObjectToClipPos(v.vertex);\r\n                \/\/\u901a\u8fc7\u5185\u7f6e\u53d8\u91cf\u83b7\u53d6\u73af\u5883\u5149\r\n                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;\r\n                \/\/\u6cd5\u7ebf\u8f6c\u6362\u5230\u4e16\u754c\u5750\u6807\r\n                \/\/unity_WorldToObject\u4e3a\u6a21\u578b\u7a7a\u95f4\u5230\u4e16\u754c\u7a7a\u95f4\u7684\u53d8\u6362\u77e9\u9635\u7684\u9006\u77e9\u9635\r\n                fixed3 worldNormal=normalize(mul(v.normal,(float3x3)unity_WorldToObject));\r\n                \/\/\u83b7\u53d6\u5149\u6e90\u65b9\u5411\r\n                fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);\r\n                \/\/\u5229\u7528\u6f2b\u53cd\u5c04\u5149\u7167\u516c\u5f0f\u8ba1\u7b97\u6f2b\u53cd\u5c04\r\n                fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*max(0,dot(worldNormal,worldLight));\r\n                \/\/mul(unity_ObjectToWorld, v.vertex)\u5c06\u9876\u70b9\u5750\u6807\u8f6c\u6362\u4e3a\u4e16\u754c\u5750\u6807\r\n                \/\/\u89c6\u89d2\u65b9\u5411=\u6444\u50cf\u5934\u4f4d\u7f6e-\u9876\u70b9\u4f4d\u7f6e\r\n                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);\r\n                \/\/\u5e73\u884c\u5149\u65b9\u5411\u4e0e\u89c6\u91ce\u65b9\u5411\u7684\u5e73\u5206\u7ebf\r\n                fixed3 halfDir = normalize(viewDir + worldLight);\r\n                \/\/\u56e0\u4e3a\u505a\u4e86normalize\u5e8f\u5217\u5316\uff0c\u6240\u4ee5\u540c\u4e0b\r\n                \/\/fixed3 halfDir = normalize((viewDir + worldLight) \/ 2)\r\n                \/\/\u6839\u636e\u516c\u5f0f\u8ba1\u7b97\u9ad8\u5149\u53cd\u5c04\r\n                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);\r\n                o.color=ambient + diffuse + specular;\r\n \r\n                return o;\r\n            }\r\n \r\n            fixed4 frag(v2f f):SV_Target\r\n            {\r\n                return fixed4(f.color,1.0);\r\n            }\r\n \r\n            ENDCG\r\n        }\r\n    }\r\n    FallBack \"Specular\"\r\n}<\/code><\/pre>\n\n\n\n<h3>\u9010\u7247\u5143\u8ba1\u7b97<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Shader \"WCC\/Specular BlinnPhong Fragment\"{\r\n    Properties\r\n    {\r\n        _Diffuse (\"Diffuse\", Color) = (1, 1, 1, 1)\r\n        \/\/\u63a7\u5236\u9ad8\u5149\u53cd\u5c04\u989c\u8272\r\n        _Specular (\"Specular\", Color) = (1, 1, 1, 1)\r\n        \/\/\u63a7\u5236\u9ad8\u5149\u533a\u57df\u5927\u5c0f\r\n        _Gloss (\"Gloss\", Range(8.0, 256)) = 20\r\n    }\r\n    SubShader\r\n    {\r\n        Pass\r\n        {\r\n            Tags { \"LightMode\"=\"ForwardBase\" }\r\n \r\n            CGPROGRAM\r\n \r\n            #pragma vertex vert\r\n            #pragma fragment frag\r\n \r\n            #include \"Lighting.cginc\"\r\n \r\n            fixed4 _Diffuse;\r\n            fixed4 _Specular;\r\n            float _Gloss;\r\n \r\n            struct a2v\r\n            {\r\n                \/\/\u6a21\u578b\u7a7a\u95f4\u7684\u9876\u70b9\u5750\u6807\r\n                float4 vertex:POSITION;\r\n                \/\/\u6a21\u578b\u7a7a\u95f4\u7684\u6cd5\u7ebf\u65b9\u5411\r\n                float3 normal:NORMAL;\r\n \r\n            };\r\n \r\n            struct v2f\r\n            {\r\n                \/\/\u8f93\u51fa\u7684\u662f\u88c1\u526a\u7a7a\u95f4\u7684\u9876\u70b9\u5750\u6807\r\n                float4 pos:SV_POSITION;\r\n                float3 worldNormal:TEXCOORD0;\r\n                float3 worldVertex:TEXCOORD1;\r\n \r\n            };\r\n \r\n            v2f vert(a2v v){\r\n                v2f f;\r\n \r\n                \/\/\u5229\u7528unity\u5185\u7f6e\u7684\u6a21\u578b-\u89c2\u5bdf-\u6295\u5f71\u77e9\u9635\u5c06\u9876\u70b9\u5750\u6807\u8f6c\u6362\u5230\u88c1\u526a\u7a7a\u95f4\r\n                f.pos=UnityObjectToClipPos(v.vertex);\r\n                \/\/\u6cd5\u7ebf\u8f6c\u6362\u5230\u4e16\u754c\u5750\u6807\r\n                \/\/unity_WorldToObject\u4e3a\u6a21\u578b\u7a7a\u95f4\u5230\u4e16\u754c\u7a7a\u95f4\u7684\u53d8\u6362\u77e9\u9635\u7684\u9006\u77e9\u9635\r\n                f.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);\r\n                \/\/mul(unity_ObjectToWorld, v.vertex)\u5c06\u9876\u70b9\u5750\u6807\u8f6c\u6362\u4e3a\u4e16\u754c\u5750\u6807\r\n                f.worldVertex=mul(unity_ObjectToWorld, v.vertex);\r\n                return f;\r\n            }\r\n \r\n            fixed4 frag(v2f f):SV_Target\r\n            {\r\n                \/\/\u901a\u8fc7\u5185\u7f6e\u53d8\u91cf\u83b7\u53d6\u73af\u5883\u5149\r\n                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;\r\n                fixed3 normalDir=normalize(f.worldNormal);\r\n                \/\/\u83b7\u53d6\u5149\u6e90\u65b9\u5411\r\n                fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz);\r\n                \/\/\u5229\u7528\u6f2b\u53cd\u5c04\u5149\u7167\u516c\u5f0f\u8ba1\u7b97\u6f2b\u53cd\u5c04\r\n                fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*max(0,dot(normalDir,lightDir));\r\n                \/\/\u89c6\u89d2\u65b9\u5411=\u6444\u50cf\u5934\u4f4d\u7f6e-\u9876\u70b9\u4f4d\u7f6e\r\n                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - f.worldVertex.xyz);\r\n                \/\/\u5e73\u884c\u5149\u65b9\u5411\u4e0e\u89c6\u91ce\u65b9\u5411\u7684\u5e73\u5206\u7ebf\r\n                fixed3 halfDir = normalize(lightDir + viewDir);\r\n                \/\/\u56e0\u4e3a\u505a\u4e86normalize\u5e8f\u5217\u5316\uff0c\u6240\u4ee5\u540c\u4e0b\r\n                \/\/fixed3 halfDir = normalize((viewDir + worldLight) \/ 2)\r\n                \/\/\u6839\u636e\u516c\u5f0f\u8ba1\u7b97\u9ad8\u5149\u53cd\u5c04\r\n                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(normalDir, halfDir)), _Gloss);\r\n                fixed3 color=ambient + diffuse + specular;\r\n\r\n                return fixed4(color,1.0);\r\n            }\r\n \r\n            ENDCG\r\n        }\r\n    }\r\n    FallBack \"Specular\"\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5b9a\u4e49 1977\u5e74\uff0c\u4e00\u4e2a\u540d\u53ebJames F. Blinn\u7684\u4eba\u63d0\u51fa\u4e86\u53e6\u4e00\u79cd\u8ba1\u7b97\u955c\u9762\u9ad8 &hellip; <a href=\"http:\/\/www.u3d8.com\/?p=2626\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[419],"tags":[],"_links":{"self":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2626"}],"collection":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2626"}],"version-history":[{"count":1,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2626\/revisions"}],"predecessor-version":[{"id":2630,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=\/wp\/v2\/posts\/2626\/revisions\/2630"}],"wp:attachment":[{"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2626"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.u3d8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}