Android Programjaim

Android, Flutter/Dart, Kotlin, Java, Unity, HarmonyOS

GLSL, shader transparency, átlátszóság, kivágás stb GLSL alatt

2012. június 06. 10:20 - lacas8282

GL_ONE                                vec4(1.0)
GL_ZERO                               vec4(0.0)
GL_SRC_COLOR                      gl_FragColor
GL_SRC_ALPHA                      vec4(gl_FragColor.a)
GL_DST_COLOR                      pixel_color
GL_DST_ALPHA                      vec4(pixel_color.a)
GL_ONE_MINUS_SRC_COLOR     vec4(1.0) - gl_FragColor
GL_ONE_MINUS_SRC_ALPHA     vec4(1.0 - gl_FragColor.a)
GL_ONE_MINUS_DST_COLOR     vec4(1.0) - pixel_color
GL_ONE_MINUS_DST_ALPHA     vec4(1.0 - pixel_color.a)

gl_FragColor=src
pixel_color  =dst


példa, vegyünk két képet, a háttér kép egy egyszerű kép, az előtér kép háttere fekete, előtérben pedig egy transparent-es kép van. (pl füst) azt akarjuk elérni, hogy a fürsös képből a fekete színeket teljesen kiszedjük, de úgy, hogy a háttér kép szépen látszódjon alatta (tehát nem sima kivágás, inkább maszkolás)
fixed pipeline-ban ez így ment kb:

háttérkép kirajzolása
transparency beállítása (GL10.GL_SRC_ALPHA, GL10.GL_ONE)
előtér kép kirajzolása a raszterbeállításokkal

Ez az eset két esetben volt jó/rossz

amennyiben 1 db plane-re akartunk rajzolni 2 textúrát, akkor ugye nem ment, mivel két plane-es a dolog. valamint GLES1.x-ben nem volt még shader, amivel pofon egyszerűen lehetett volna ezt megírni.

nézzük, hogy menne ez 1 db plane-el, amin van 2 db textúra, ami ugyanezt csinálja

A fregmens shaderbe kell 2 db textúra, amit majd kívűlről megadunk:

        "uniform sampler2D uDiffuseTexture;\n" +
        "uniform sampler2D uNormalTexture;\n" +

és végül a mainbe kell:

        "    vec4 src = texture2D(uDiffuseTexture, vec2(vTextureCoord.x, vTextureCoord.y));\n" +
        "    vec4 dst = texture2D(uNormalTexture, vec2(vTextureCoord.x, vTextureCoord.y )*alpha;\n" +
        "    vec4 res = SRC_FACTOR + DST_FACTOR;\n"+
        "    gl_FragColor = res;\n" +

az SRC_FACTOR: GL_SRC_ALPHA azaz "vec4(src.a)*src"
a DST_FACTOR: GL_DST_COLOR azaz "dst"
 

az alpha lehet az a float típusú alfa, amivel azt akarjuk elérni, hogy a második textúra 20%-ban legyen átlátszó az elsőn. ezis egy uniform.

GLSL transparencyről fontos olvasmány

komment
süti beállítások módosítása