COLOR_MASK - 开启或是关闭颜色成分的写入
COLOR_MASK(r, g, b, a): 4个参数分别开启或是关闭Red,Green,Blue,Alpha的写入,1为开启,0为关闭。
COLOR_MASK一般情况不会单独使用,会和其他命令,例如BlendFunc和一起使用。
COLOR_MASK 命令可以允许或禁止对颜色缓冲和alpha缓冲的写入。这个技术首先将图形“绘制”至alpha缓冲中,之后使
用BlendFunc(DST ALPHA, ONE) 实现对屏幕上所有像素的混合模式绘制。在绘制时,只有alpha缓冲非零时才会被绘制出来。
同样以画一个圆环为例。
首先用COLOR_MASK 命令禁止对颜色缓冲写入,之后向BlendFunc 写入一个可以把之后的alpha值直接写入alpha缓冲的参
数。设置方法是将源混合因子设置为ONE:
ftWrDispCmd(COLOR_MASK(0, 0, 0, 1));
ftWrDispCmd(BLEND_FUNC(ONE, ONE_MINUS_SRC_ALPHA));
ftWrDispCmd(BEGIN(FTPOINTS));
ftWrDispCmd(POINT_SIZE(90 * 16));
ftWrDispCmd(VERTEX2F((PANEL_WIDTH / 2) * 16, (PANEL_HEIGHT / 2) * 16));
这里画了一个大小为90pixel的圆(即外部圆形),它并没有显示到屏幕上,只会影响alpha缓冲。
绘制内部圆时需要将混合模式设置为覆盖之前已经绘制的所有像素,即将源混合因子设置为ZERO:
ftWrDispCmd(BLEND_FUNC(ZERO, ONE_MINUS_SRC_ALPHA));
ftWrDispCmd(POINT_SIZE(80 * 16));
ftWrDispCmd(VERTEX2F((PANEL_WIDTH / 2) * 16, (PANEL_HEIGHT / 2) * 16));
这一步是将之前那个外部圆形内部的内圆显示内容消掉。
经过以上的操作之后,目前还没有任何内容能在屏幕上可见– 因为COLOR_MASK 命令禁止了对R,G,B通道的绘制。但是在alpha缓冲上,已经有了一个圆环。
最后是设置COLOR_MASK的颜色通道使能,源混合因子设置为了DST ALPHA, 这样一来,透明值的大小就来自于alpha缓冲
了。
ftWrDispCmd(COLOR_MASK(1, 1, 1, 0));
ftWrDispCmd(BLEND_FUNC(DST_ALPHA, ONE));
ftWrDispCmd(POINT_SIZE(90 * 16));
ftWrDispCmd(VERTEX2F((PANEL_WIDTH / 2) * 16, (PANEL_HEIGHT / 2) * 16));
显示结果如下图: