光源携带不同属性成为不同种类的光源。这里举出一些常用光源的模型。
点光源PointLight
原本使用的光源就是点光源。
struct Light{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
光照随距离衰减Attenuation
认为强度与距离二次方成反比,于是模型为:
$$ Attenuation = 1/P_2(distance)=1/(constant+linear*d+quadratic*d*d) $$struct AttenuatedPointLight{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
vec3 coeffient;
};
锥形光SpotLight
用一个cutOff属性和在shader中使用if语句,判断片段是否被照射了,应该渲染diffuse和specular。
当连接光源和片段的向量与锥形方向向量夹角过大时舍去。
struct SpotLight{
vec3 position;
vec3 direction;
vec3 ambient;
vec3 diffuse;
vec3 specular;
float cutOff;
};
柔化边缘SmoothEdge
边缘定义为cutOff($\phi$)和outerCutOff($\gamma$)之间的部分,这里使用了简单的线性插值递减。其他方式当然也可以。
$$ intensity(\theta) = (\theta-\gamma)/(\phi-\gamma) $$struct SmoothlyEdgedSpotLight{
vec3 position;
vec3 direction;
vec3 ambient;
vec3 diffuse;
vec3 specular;
float cutOff;
float outerCutOff;
};
平行光DirectionalLight
没有位置只有方向。
struct DirectionalLight{
vec3 direction;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
comment 评论区
star_outline 咱快来抢个沙发吧!