OpenGL | 渲染带透明通道的2D精灵

一、Alpha测试

        Alpha 测试的基本原理为:当绘制一个片元时,首先检测其 Alpha 值,若 Alpha 值满足要求,就通过测试,绘制此片元;否则丢弃此片元,不进行绘制。

glEnable(GL_ALPHA_TEST);//激活Alpha测试
glAlphaFunc(GL_GREATER,0.1f);//图形透明度只有大于0.1f 的坐标点才显示

 1.glAlphaFunc

void glAlphaFunc(GLenum func,GLclampf ref);
  •  GLenum 是unsigned int类型,参数func的可能值及其含义如下:
    • GL_NEVER:总不接受该片元;
    • GL_ALWAYS:总是接受该片元;
    • GL_LESS:若片元alpha<参考alpha,接受该片元;
    • GL_LEQUAL:片元alpha<=参考值alpha,接受;
    • GL_GREATER:片元alpha > 参考alpha接受;
    • GL_NOTEQUAL:片元alpha不等于参考alpha,接受;
  • GLclampf 是float类型,参考值ref取值在0和1之间截取。

二、混合

        Alpha测试针对的是透明度,要么通过(不透明)要么不通过(透明)。要达到半透明的效果必须使用blend混合来实现。

        OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多种颜色为一种颜色。所以透明度能让我们看穿物体。

        纹理中有透明时,想让它透过背面的3D物体。这个就要设置混合了:

  1. 首先要开启混色功能glEnable(GL_BLEND)。
  2. 其次还要为它指定混色方案。这里面就要选用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)了。需要注意的问题是先画不透明或是透明物体后方的物体,然后再画透明物体。这样就可以通过透明物体看到它背后的3D物体了。
  3. 最后glDisable(GL_BLEND)关闭融合效果
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //...
	glDisable(GL_BLEND);
  • GL_SRC_ALPHA 表示源因子,取值为源颜色 alpha (透明度)通道值
  • GL_ONE_MINUS_SRC_ALPHA 表示目标因子,取值为 1- 源alpha(源颜色的 alpha)

1.混合公式

C_{result} = C_{source} * F_{source} + C_{destination} * F_{destination}

  • C_{source}:源颜色向量,这是源自纹理的颜色向量。
  • F_{source}:源因子值,指定了alpha值对源颜色的影响。
  • C_{destination}:目标颜色向量,这是当前储存在颜色缓冲中的颜色向量。
  • F_{destination}:目标因子值,指定了alpha值对目标颜色的影响。

 三、参考文档

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/129812010