CG之基本光照模型计算公式
2016-06-01 15:50
591 查看
在一个基本模型里,一个物体表面的颜色是由放射(emissive)、环境反射(ambient)、漫反射(diffuse)和镜面反射(specular)等光照作用的总和。每种光照作用取决于表面材质的性质(如亮度和材质颜色)和光源的性质(如光的颜色和位置)的共同作用。
从数学上描述基本模型的高级公式如下所示:
surfaceColor = emissive +ambient + diffuse + specular
一、放射项
emissive = Ke
其中:
Ke代表材质的放射光颜色。
二、环境反射项
ambient = Ka * globalAmbient
其中:
Ka是材质的环境反射系数。
globalAmbient是入射环境光的颜色。
三、漫反射项
diffuse = Kd * lightColor * max(dot(N, L), 0)
其中:
Kd是材质的漫反射颜色。
lightColor是入射漫反射光的颜色。
N是规范化的表面法向量。
L是规范化的从顶点到光源的向量。
四、镜面反射项
specular = Ks * lightColor * facing * pow(max(dot(N, H), 0), shininess)
其中:
Ks 是材质的镜面反射颜色。
lightColor是入射镜面反射光的颜色。
N是规范化的表面法向量。
H是规范化的,顶点到光源的向量与顶点到眼睛的向量的中间向量。
facing是,如果dot(N,L)大于0则为1,否则为0。其中L是顶点到光源位置的向量。
shinniess是表面光泽度。
例如,在unity3d shaderLab,在顶点shader中计算光照的代码如下:
shader
效果图如下:
转载请注明出处: http://www.cnblogs.com/jietian331/p/5549889.html
从数学上描述基本模型的高级公式如下所示:
surfaceColor = emissive +ambient + diffuse + specular
一、放射项
emissive = Ke
其中:
Ke代表材质的放射光颜色。
二、环境反射项
ambient = Ka * globalAmbient
其中:
Ka是材质的环境反射系数。
globalAmbient是入射环境光的颜色。
三、漫反射项
diffuse = Kd * lightColor * max(dot(N, L), 0)
其中:
Kd是材质的漫反射颜色。
lightColor是入射漫反射光的颜色。
N是规范化的表面法向量。
L是规范化的从顶点到光源的向量。
四、镜面反射项
specular = Ks * lightColor * facing * pow(max(dot(N, H), 0), shininess)
其中:
Ks 是材质的镜面反射颜色。
lightColor是入射镜面反射光的颜色。
N是规范化的表面法向量。
H是规范化的,顶点到光源的向量与顶点到眼睛的向量的中间向量。
facing是,如果dot(N,L)大于0则为1,否则为0。其中L是顶点到光源位置的向量。
shinniess是表面光泽度。
例如,在unity3d shaderLab,在顶点shader中计算光照的代码如下:
Shader "Custom/Test" { Properties { _Ke("Ke", Color) = (1,1,1,1) _Ka("Ka", Color) = (1,1,1,1) _GlobalAmbient("Global ambient", Color) = (1,1,1,1) _Kd("Kd", Color) = (1,1,1,1) _Ks("Ks", Color) = (1,1,1,1) _Shininess("", float) = 1 } SubShader { Pass { Tags { "RenderType" = "Opaque" } CGPROGRAM #pragma vertex Vert #pragma fragment Frag #include "UnityCG.cginc" #include "Lighting.cginc" uniform float4 _Ke; uniform float4 _Ka; uniform float4 _GlobalAmbient; uniform float4 _Kd; uniform float4 _Ks; uniform float _Shininess; struct VertexInput { float4 pos : POSITION; float2 uv : TEXCOORD0; float3 nor : NORMAL; float4 col : COLOR; }; struct FragmentInput { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float4 col : COLOR; }; FragmentInput Vert(VertexInput vi) { FragmentInput fi; fi.pos = mul(UNITY_MATRIX_MVP, vi.pos); fi.uv = vi.uv; // compute emissive float3 emissiveC = _Ke.rgb; // compute ambient float3 ambientC = _Ka.rgb * _GlobalAmbient.rgb; // compute diffuse float3 nor = mul(vi.nor, (float3x3)_World2Object); float3 dir2Light = normalize(WorldSpaceLightDir(vi.pos)); float nl = max(0, dot(nor, dir2Light)); float3 diffuseC = _Kd.rgb * _LightColor0.rgb * nl; // compute specular float3 dir2Cam = normalize(WorldSpaceViewDir(vi.pos)); float nh = max(0, dot(nor, dir2Cam + dir2Light)); float specLight = nl > 0 ? pow(nh, _Shininess) : 0; float3 specC = _Ks * _LightColor0.rgb * specLight; fi.col.rgb = emissiveC + ambientC + diffuseC + specC; fi.col.a = 1; return fi; } float4 Frag(FragmentInput fi) : Color { return fi.col; } ENDCG } } }
shader
效果图如下:
转载请注明出处: http://www.cnblogs.com/jietian331/p/5549889.html
相关文章推荐
- .Net 异步方法加上“timeout”
- JDBC连接MySQL
- 读图片
- oracle 游标使用根据工龄更新年假
- [置顶] Android开发之高亮引导
- eclipse 中使用 RecyclerView
- 我推荐的Java书籍
- Highcharts基本用法
- 关系表与非关系表的区别
- yum安装nginx 加载image_filter 加载方式
- android6.0指纹开发
- SAP STO小解
- 给Eclipse提速的7个技巧
- Android系统架构-----Android的系统体系架构
- iOS开发Xcode6添加.pch
- Odd Even Linked List
- jquery missing semicolon
- oracle的基本操作
- leetcode 75. Sort Colors-颜色排序|双指针
- Android 培训课件编写--- 第1章 Android应用开发概述