博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】Forward Rendering处理多光源
阅读量:4087 次
发布时间:2019-05-25

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

Shader "Forward Rendering" {    Properties {        _Diffuse ("Diffuse", Color) = (1, 1, 1, 1)        _Specular ("Specular", Color) = (1, 1, 1, 1)        _Gloss ("Gloss", Range(8.0, 256)) = 20    }    SubShader {        Tags { "RenderType"="Opaque" }        Pass {            // Pass for ambient light & first pixel light (directional light)            Tags { "LightMode"="ForwardBase" }            CGPROGRAM            // Apparently need to add this declaration             // #pragma multi_compile_fwdbase                #pragma vertex vert            #pragma fragment frag            #include "Lighting.cginc"            fixed4 _Diffuse;            fixed4 _Specular;            float _Gloss;            struct a2v {                float4 vertex : POSITION;                float3 normal : NORMAL;            };            struct v2f {                float4 pos : SV_POSITION;                float3 worldNormal : TEXCOORD0;                float3 worldPos : TEXCOORD1;            };            v2f vert(a2v v) {                v2f o;                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;                return o;            }            fixed4 frag(v2f i) : SV_Target {                fixed3 worldNormal = normalize(i.worldNormal);                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                fixed3 halfDir = normalize(worldLightDir + viewDir);                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);                return fixed4(ambient + (diffuse + specular) , 1.0);            }            ENDCG        }        Pass {            // Pass for other pixel lights            Tags { "LightMode"="ForwardAdd" }            Blend One One            CGPROGRAM            // Apparently need to add this declaration            #pragma multi_compile_fwdadd            #pragma vertex vert            #pragma fragment frag            #include "Lighting.cginc"            #include "AutoLight.cginc"            fixed4 _Diffuse;            fixed4 _Specular;            float _Gloss;            struct a2v {                float4 vertex : POSITION;                float3 normal : NORMAL;            };            struct v2f {                float4 pos : SV_POSITION;                float3 worldNormal : TEXCOORD0;                float3 worldPos : TEXCOORD1;            };            v2f vert(a2v v) {                v2f o;                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;                return o;            }            // 不在需要环境光的叠加,在BasePass中已经计算过环境光的影响了,多次叠加会导致色彩异常            fixed4 frag(v2f i) : SV_Target {                fixed3 worldNormal = normalize(i.worldNormal);                #ifdef USING_DIRECTIONAL_LIGHT                    // 平行光直接可获取到 顶点到灯光的方向                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);                #else                    // 如果是其他类型的灯光还需要进一步手动计算                    fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz);                #endif                // 1.漫反射                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldNormal, worldLightDir));                fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                fixed3 halfDir = normalize(worldLightDir + viewDir);                // 2.高光反射                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);                // 3.计算光照衰减 attenuation                #ifdef USING_DIRECTIONAL_LIGHT                    fixed atten = 1.0;                #else                    #if defined (POINT)                        // 计算顶点到光源的 光源空间位置 【注意:是unity_WorldToLight】                        float3 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1)).xyz;                        // _LightTexture0用来计算光照衰减,如果用了cookie,需要使用_LightTextureB0来计算                        fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;                    #elif defined (SPOT)                        float4 lightCoord = mul(unity_WorldToLight, float4(i.worldPos, 1));                        fixed atten = (lightCoord.z > 0) * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;                    #else                        fixed atten = 1.0;                    #endif                #endif                return fixed4((diffuse + specular  ) * atten, 1.0);            }            ENDCG        }    }    FallBack "Specular"}

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

你可能感兴趣的文章
我刚刚才完全清楚GPS模块的那根杆子是怎么固定安装好的
查看>>
去github里面找找也没有别人无人机+SLAM的工程
查看>>
PX4与ROS关系以及仿真控制(键盘控制无人机)
查看>>
我对无人机重心高度的理解
查看>>
现在明白为什么无名博客里好几篇文章在讲传感器的滞后
查看>>
实际我看Pixhawk定高模式其实也是飞得很稳,飘得也不厉害
查看>>
Pixhawk解锁常见错误
查看>>
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>