Tuesday, December 3, 2013

Sponza рэндэрлэх оролдлого 7, Diffuse гэрэлтүүлэг

Lambertian Diffuse Lighting томъёо нь view-space дотор орж ирсэн гэрэл болон гадаргуун нормал хоёрын хоорондох өнцөгийн косинусыг intensity утга болгож аван хэрэглэдэг.
Point light үүсгээд ганцхан ламберт хэрэглэвэл дараах байдалтай харагдаж байна. Гэрэл тусаагүй хэсэг нь тэр чигтээ хар өнгөтэй байна. Яагаад гэвэл ambient факторыг гэрэлтүүлгэнд хэрэглээгүй болохоор тэр юм.


Fragment Shader
#version 330
uniform sampler2D material_diffuse_texture;
uniform sampler2D material_normal_texture;
uniform sampler2D material_ambient_texture;
uniform sampler2D material_specular_texture;
uniform sampler2D material_opacity_texture;
uniform float     material_shininess; 
uniform vec4      material_diffuse_color;

uniform int hasOpacityMap;
uniform int hasAmbientMap;

uniform float ambientIntensity;

uniform vec3 lightPosition; // world-space

in vec2 vTexcoord;
in vec3 vPosition; // world-space
in vec3 vNormal;   // view-space
in vec3 vEyeDir;   // view-space
in vec3 vLightDir; // view-space

out vec4 out_color;

void main(void)
{
    vec3 lightColor = vec3(1.0, 1.0, 1.0);

    vec4 diffuseColor  = texture2D(material_diffuse_texture, vTexcoord);
    vec4 ambientColor  = texture2D(material_ambient_texture, vTexcoord);
    vec4 normalColor   = vec4(texture2D(material_normal_texture , vTexcoord).xyz, 1.0);
    vec4 specularColor = texture2D(material_specular_texture, vTexcoord);
    vec4 opacityColor  = texture2D(material_opacity_texture, vTexcoord);

    if (hasAmbientMap==0) {
        ambientColor = diffuseColor;
    }

    vec3 normal = normalize(vNormal);
    vec3 lightDirection = normalize(vLightDir);
    float diffuseIntensity = max(0.0, dot(normal, lightDirection));
    
    vec4 resultColor = vec4(diffuseColor.xyz * lightColor * diffuseIntensity, 1);
    
    if (hasOpacityMap!=0){
        if (opacityColor.rgb==vec3(0,0,0))
            discard;
        else
            out_color = resultColor;
    } else {
        out_color = resultColor;
    }
}


Хэрвээ ambient факторыг гэрэлтүүлгийн тооцоололд оруулж ирвэл нэг иймэрхүү болж байна. Сүүдэрлэгдсэн харанхуй хэсэгт ambient өнгө нэмэгдэн орж ирж байна гэсэн үг.



ambient өнгө ашигласан fragment shader нь
#version 330
uniform sampler2D material_diffuse_texture;
uniform sampler2D material_normal_texture;
uniform sampler2D material_ambient_texture;
uniform sampler2D material_specular_texture;
uniform sampler2D material_opacity_texture;
uniform float     material_shininess; 
uniform vec4      material_diffuse_color;

uniform int hasOpacityMap;
uniform int hasAmbientMap;

uniform float ambientIntensity;

uniform vec3 lightPosition; // world-space

in vec2 vTexcoord;
in vec3 vPosition; // world-space
in vec3 vNormal;   // view-space
in vec3 vEyeDir;   // view-space
in vec3 vLightDir; // view-space

out vec4 out_color;

void main(void)
{
    vec3 lightColor = vec3(1.0, 1.0, 1.0);

    vec4 diffuseColor  = texture2D(material_diffuse_texture, vTexcoord);
    vec4 ambientColor  = texture2D(material_ambient_texture, vTexcoord);
    vec4 normalColor   = vec4(texture2D(material_normal_texture , vTexcoord).xyz, 1.0);
    vec4 specularColor = texture2D(material_specular_texture, vTexcoord);
    vec4 opacityColor  = texture2D(material_opacity_texture, vTexcoord);

    if (hasAmbientMap==0) {
        ambientColor = diffuseColor;
    }

    vec3 normal = normalize(vNormal);
    vec3 lightDirection = normalize(vLightDir);
    float diffuseIntensity = max(0.0, dot(normal, lightDirection));
    
    vec4 resultColor = 
        vec4(ambientColor.xyz * ambientIntensity, 1) +
        vec4(diffuseColor.xyz * lightColor * diffuseIntensity, 1);
    
    if (hasOpacityMap!=0){
        if (opacityColor.rgb==vec3(0,0,0))
            discard;
        else
            out_color = resultColor;
    } else {
        out_color = resultColor;
    }
}

Specular өнгөний тухайд гэвэл Blinn-Phong ийн аргыг хэрэглэж рэндэрлэсэн боловч сүүдэр хэсэгтээ тун алдаатай рэндэрлэгдэж байгаа, үүний учрыг явцын дунд олноо. Хэдийгээр дараах зурганд навчных нь specular хэсэг нь тодорч харагдаж байгаа ч сүүдэр хэсэгтээ тун таагүй үр дүнд хүрснийг харж байгаа байхаа.