array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 UnityShader 学习笔记 3 凹凸映射 - 爱码网

原图:
UnityShader 学习笔记 3 凹凸映射
UnityShader 学习笔记 3 凹凸映射
效果图:
UnityShader 学习笔记 3 凹凸映射
UnityShader 学习笔记 3 凹凸映射

  • 切线空间下的凹凸映射:


Shader "_MyShader/4_Texture/2_BumpMap/TangentSpace"

{

    Properties

    {

        _Color ("Color",COLOR) = (1,1,1,1)

            _MainTex ("MainTex",2D) = "white" {}

            _BumpMap ("NormalMap",2D) = "bump" {}

            _BumpScale ("BumpScale",float) = 1.0

            _SpecularRange ("SpecularRange",Range(10,250)) = 20

    }

    SubShader

    {

        Pass

        {

            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag



            #include "Lighting.cginc"

            #include "UnityCG.cginc"



            fixed4 _Color;

            sampler2D _MainTex;

            float4 _MainTex_ST;

            sampler2D _BumpMap;

            float4 _BumpMap_ST;

            float _BumpScale;

            float _SpecularRange;





            struct a2v {

                float4 vertex:POSITION;

                float4 tangent:TANGENT;

                float4 texcoord:TEXCOORD0;

                float3 normal:NORMAL;

            };



            struct v2f{

                float4 pos:SV_POSITION;

                float4 uv:TEXCOORD0;

                float3 tangentLightDir:TEXCOORD1;

                float3 tangentViewDir:TEXCOORD2;

                float3 blinn_Phong_Dir:TEXCOORD3;

            };



            v2f vert(a2v v){

                v2f o;

                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);



                //o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

                //o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;

                o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);

                o.uv.zw = TRANSFORM_TEX(v.texcoord,_BumpMap);



                TANGENT_SPACE_ROTATION;

                o.tangentLightDir = normalize(mul(rotation,ObjSpaceLightDir(v.vertex)));

                o.tangentViewDir = normalize(mul(rotation,ObjSpaceViewDir(v.vertex)));



                //Blinn-Phong

                o.blinn_Phong_Dir = normalize(o.tangentLightDir + o.tangentViewDir);



                return o;

            }



            fixed4 frag(v2f i):SV_Target{

                //UnpackNormal,UnpackNormalDXT5nm 得到正确的法线方向

                fixed3 tangentNormal = UnpackNormalDXT5nm(tex2D(_BumpMap,i.uv.zw));

                tangentNormal *= _BumpScale;



                fixed3 uvTex = tex2D(_MainTex,i.uv.xy).rgb * _Color.rgb;

                fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * uvTex;



                fixed3 diffuseColor =    _LightColor0 * uvTex * saturate(dot(tangentNormal,i.tangentLightDir));



                fixed3 SpecularColor =    _LightColor0 * pow(saturate(dot(tangentNormal,i.blinn_Phong_Dir)),_SpecularRange);



                fixed4 col = fixed4(diffuseColor + SpecularColor + ambientColor,1);



                return col;

            }





            ENDCG

        }

    }

    FallBack "Specular"

}




  • 世界空间下的凹凸映射


Shader "_MyShader/4_Texture/2_BumpMap/WorldSpace"

{

    Properties

    {

        _Color ("Color",COLOR) = (1,1,1,1)

            _MainTex ("MainTex",2D) = "white" {}

            _BumpMap ("NormalMap",2D) = "bump" {}

            _BumpScale ("BumpScale",float) = 1.0

            _SpecularRange ("SpecularRange",Range(10,250)) = 20

    }

    SubShader

    {

        Pass

        {

            Tags{"LightMode" = "ForwardBase"}

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag



            #include "Lighting.cginc"

            #include "UnityCG.cginc"



            fixed4 _Color;

            sampler2D _MainTex;

            float4 _MainTex_ST;

            sampler2D _BumpMap;

            float4 _BumpMap_ST;

            float _BumpScale;

            float _SpecularRange;





            struct a2v {

                float4 vertex:POSITION;

                float4 tangent:TANGENT;

                float4 texcoord:TEXCOORD0;

                float3 normal:NORMAL;

            };



            struct v2f{

                float4 pos:SV_POSITION;

                float4 uv:TEXCOORD0;

                float3 worldLightDir:TEXCOORD1;

                float3 blinn_Phong_Dir:TEXCOORD2;

                float3 TtoW0:TEXCOORD3;

                float3 TtoW1:TEXCOORD4;

                float3 TtoW2:TEXCOORD5;

            };



            v2f vert(a2v v){

                v2f o;

                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);



                //o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

                //o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;

                o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);

                o.uv.zw = TRANSFORM_TEX(v.texcoord,_BumpMap);



                o.worldLightDir = normalize(WorldSpaceLightDir(v.vertex));

                float3 worldViewDir = normalize(WorldSpaceViewDir(v.vertex));

                float3 worldNormal = UnityObjectToWorldNormal(v.normal);



                float3 worldTangent = UnityObjectToWorldDir(v.tangent);



                float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) ) * v.tangent.w;



                //Blinn-Phong

                o.blinn_Phong_Dir = normalize(o.worldLightDir + worldViewDir);



                o.TtoW0 = float3(worldTangent.x,binormal.x,worldNormal.x);

                o.TtoW1 = float3(worldTangent.y,binormal.y,worldNormal.y);

                o.TtoW2 = float3(worldTangent.z,binormal.z,worldNormal.z);



                return o;

            }



            fixed4 frag(v2f i):SV_Target{

                //UnpackNormal,UnpackNormalDXT5nm 得到正确的法线方向



                //fixed3 worldNormal = UnpackNormalDXT5nm(tex2D(_BumpMap,i.uv.zw));

                //worldNormal *= _BumpScale;

                fixed3 bump = UnpackNormal(tex2D(_BumpMap,i.uv.zw));

                bump.xy *= _BumpScale;

                bump.z = sqrt(1 - saturate(dot(bump.xy, bump.xy)));



                fixed3 uvTex = tex2D(_MainTex,i.uv.xy).rgb * _Color.rgb;

                fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * uvTex;



                fixed3 diffuseColor =    _LightColor0 * uvTex * saturate(dot(bump,i.worldLightDir));



                fixed3 SpecularColor =    _LightColor0 * pow(saturate(dot(bump,i.blinn_Phong_Dir)),_SpecularRange);



                fixed4 col = fixed4(diffuseColor + SpecularColor + ambientColor,1);



                return col;

            }





            ENDCG

        }

    }

    FallBack "Specular"

}




相关文章: