今天遇到了一个问题 解决了很久。是这样的,美术给的一张图,黑底彩图,RGB,没有alpha通道,使用src:alpha dst:one的方式进行混合,法线这张图的黑色被滤掉了,出现了alpha透明的效果。如下图
原图
混合后的图
乍一看没什么问题,不过稍微想了一下,我的图是不带alpha通道的,也就是通常认为的没有透明信息的,怎么它就变透明了呢,应该是黑色也会叠加上才对啊。
于是一行行看shader,还是没明白,最后还是用pix截了一帧仔细分析才看出来。
原来黑色的rgb是(0,0,0),对于一张没有alpha通道的图,它的a值都为1,这样在混合的过程中,结果的RGB=1*(0,0,0)+dst=dst
也就是说对于那些黑色覆盖的像素,直接就是原先的颜色,就是透明了!!!
发现这个问题之后 才发现原来是自己纠结了一个很蠢的问题,那就是黑色覆盖白色不等于黑色,还是白色!这似乎是我的思维定势了,似乎认为黑色叠加给别的表面上会把“黑色”叠上去,其实在图形学里黑色是(0,0,0),叠上去什么也没有。这跟画水彩画可不一样。在这个意义上黑色其实就等同了透明。
其实这种美术技巧应用于了很多美术场景,对于一些透明(叠加方式)的效果,美术可以直接在黑底上做画,不用做alpha通道
那么一个问题是,如果想要真的把“黑色”也真的叠上去该怎么办:一种是真的做alpha通道,混合方式使用alpha混合,一种是不做alpha通道,混合的方式采用1-dst ,dst 等混合方式,总之blend是多种多样的,以前一直没有细致的扣每一种方式的表现效果