版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DdogYuan/article/details/84585863
放射光贴图
放射光贴图(Emission Map)的东西,它是一个储存了每个片段的发光值(Emission Value)的贴图。发光值是一个包含(假设)光源的物体发光(Emit)时可能显现的颜色,这样的话物体就能够忽略光照条件进行发光(Glow)。
游戏中某个物体在发光的时候,你通常看到的就是放射光贴图(比如机器人的眼睛
或者箱子上的灯带)
GLSL实现
放射光贴图应该作为材质的一个属性:
struct Material {
sampler2D diffuse;
sampler2D specular;
sampler2D emission;
float shininess;
};
并且在片元着色器中,直接采样给结果(不经过光照计算):
...//省略了ambient 和specular分量
// diffuse 漫反射分量是由纹理和光照计算得到的数值相加而成
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(light.position - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;
// emission 放射光贴图直接采样纹理
vec3 emission = texture(material.emission, TexCoords).rgb;
vec3 result = ambient + diffuse + specular + emission;
FragColor = vec4(result, 1.0);
参考
LearnOpenGL教程——光照贴图:
https://learnopengl-cn.github.io/02 Lighting/04 Lighting maps/