1. 程式人生 > >放射光貼圖

放射光貼圖

放射光貼圖

放射光貼圖(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/