Sponza рэндэрлэх оролдлого 6, Opacity mapping, durty solution

Opacity map-ийг color key байдлаар хэрэглэж текстурын хэрэгцээгүй хэсгийг рэндэрлэхгүй байх боломжийг олгоно.
Жишээ нэг навчны текстур байлаа.



Тэгвэл энэний хувьд opacity mapping texture нь дараах байдалтай байна.


Opacity texture-ээс нь харвал хар өнгөтэй хэсэг нь рэндэрлэгдэх шаардлагагүй буюу хар өнгө бол color key нь байна гэдэг нь шууд мэдэгдэнэ. Хар өнгөний rgb вектор нь vec3(0,0,0)
Тиймээс shader програм дээрээ opacity texel орж ирэх үед өнгийг нь хар байна уу үгүй юу шалгаад хэрэв тийм бол тэр texel-ийн байгаа UV координат дээрхи diffuse map-ийн texel-ийг discard хийнэ. Ийм байдлаар дараах үр дүнд хүрлээ.


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;
in vec2 varyingTexcoord;
out vec4 out_color;
void main(void)
{
    
    vec4 diffuseColor  = texture2D(material_diffuse_texture, vec2(varyingTexcoord.x, varyingTexcoord.y));
    vec4 ambientColor  = texture2D(material_ambient_texture, vec2(varyingTexcoord.x, varyingTexcoord.y));
    vec4 normalColor   = vec4(texture2D(material_normal_texture , vec2(varyingTexcoord.x, varyingTexcoord.y)).xyz, 1.0);
    vec4 specularColor = texture2D(material_specular_texture, vec2(varyingTexcoord.x, varyingTexcoord.y));
    vec4 opacityColor  = texture2D(material_opacity_texture, vec2(varyingTexcoord.x, varyingTexcoord.y));
    if (hasOpacityMap!=0){
        if (opacityColor.rgb==vec3(0,0,0))
            discard;
        else
            out_color = diffuseColor;
    } else {
        out_color = diffuseColor;
    }
}




Popular posts from this blog

Apache Spark + Cassandra. Hello World