博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】切线空间下的法线贴图
阅读量:4088 次
发布时间:2019-05-25

本文共 2537 字,大约阅读时间需要 8 分钟。

Shader "Unlit/NormalTex"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _MainNormalTex("NormalTex",2D) = "white"{}    }    SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100        Pass        {            Tags{                "LightMode"="ForwardBase"            }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            #include "Lighting.cginc"            struct a2v            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                float3 normal:NORMAL;                float4 tangent:TANGENT;            };            struct v2f            {                float4 uv : TEXCOORD0;                float4 vertex : SV_POSITION;                float3 lightDir : TEXCOORD1;                float3 viewDir : TEXCOORD2;            };            sampler2D _MainTex;            float4 _MainTex_ST;            sampler2D _MainNormalTex;            float4 _MainNormalTex_ST;            v2f vert (a2v v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                // 缩放+偏移                o.uv.xy = TRANSFORM_TEX(v.uv,_MainTex);                o.uv.zw = TRANSFORM_TEX(v.uv,_MainNormalTex);                // 构造切线空间,此处需要计算副切线才能使用float2x3矩阵构造                // 新的切线空间名字是:rotation                TANGENT_SPACE_ROTATION;                o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex ));                o.viewDir = mul(rotation,ObjSpaceViewDir(v.vertex));                return o;            }            fixed4 frag (v2f i) : SV_Target            {                // L V                fixed3 tangentLightDir = normalize(i.lightDir);                fixed3 tangentViewDir = normalize(i.viewDir);                // N                fixed4 packedNormal = tex2D(_MainNormalTex,i.uv.zw);                fixed3 tangentNormal = UnpackNormal(packedNormal);                // tangentNormal.z = sqrt(1-saturate(dot(tangentNormal.xy,tangentNormal.xy)));                float3 albedo = tex2D(_MainTex,i.uv.xy).rgb;                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;                fixed3 diffuse = _LightColo-r0.rgb  * albedo* max(0,dot(tangentNormal,tangentLightDir));                fixed3 halfDir = normalize(tangentLightDir+tangentViewDir);                fixed3 specular = _LightColor0.rgb *  pow(max(0,dot(tangentNormal,halfDir)),20);                return fixed4( diffuse+ambient+specular,1.0);            }            ENDCG        }    }}

转载地址:http://jdkii.baihongyu.com/

你可能感兴趣的文章
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>