三种光照模型的shader实现
2017-02-27 17:11
316 查看
1.Lambert模型,公式为I=Kd*Il(N*L);
Blinn_Phong
Shader "Custom/Blinn_Phong" { Properties { _Diffuse("Diffuse",Color)=(1,1,1,1) _Specular("Specular",COlor)=(1,1,1,1) _Gloss("Gloss",Range(8.0,256))=20 } SubShader { Tags { "LightMode"="ForwardBase" } Pass{ CGPROGRAM #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; fixed3 worldNormal:TexCOORD0; float3 worldPos:TEXCOORD1; }; v2f vert(a2v v) { v2f o; o.pos=mul(UNITY_MATRIX_MVP,v.vertex); o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject); o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz; return o; } fixed4 frag(v2f i):SV_Target { fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz; fixed3 worldNormal=normalize(i.worldNormal); fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz); fixed3 diffuse=_LightColor0.rgb*_Diffuse.rgb*saturate(dot(worldNormal,worldLightDir)); //fixed3 reflectDir=normalize(reflect(-worldLightDir,worldNormal)); fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz); fixed3 halfDir=normalize(worldLightDir+viewDir); fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(saturate(dot(worldNormal,halfDir)),_Gloss); return fixed4(ambient+diffuse+specular,1.0); } ENDCG } } FallBack "Specular" }
Blinn_Phong
相关文章推荐
- Shader自学笔记 2.1.2 逐像素漫反射光照模型实现
- Unity3D - Shader - 实现漫反射光照模型
- Shader自学笔记 2.1.3 半兰伯特光照模型实现
- <unity shader入门精要> - unity shader 中实现漫反射光照模型
- 用Shader实现标准光照模型
- UnityShader初级篇——实现逐顶点高光反射光照模型
- Unity实现标准光照模型的Shader代码
- Unity3D Shader之光照模型——理论与实践:用两种方式来实现漫反射Diffuse Reflection
- Shader自学笔记 2.1.1 逐顶点漫反射光照模型实现
- 光照模型及cg实现
- 探究OpenGL光照模型的着色器实现
- HLSL实现漫反射光照模型
- OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型
- Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.
- LINUX环境并发服务器的三种实现模型
- 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型
- HLSL实现镜面反射光照模型
- Shader系列(1):Lambert光照模型
- OpenGL4.0 GLSL 实现逐片元光照模型 提高场景真实性
- 基于CPU的Bank BRDF经验模型,实现各向异性光照效果!