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