透明度测试(丢弃片段)
比如在2D四边形(Quad)上渲染一个草的纹理时,值希望保留草的部分(alpha值为1.0),然而丢弃那些透明的部分(alpha值为0.0)。
因此我们可以在片元着色器中,检测一个片段的alpha值是否低于某个阈值,若果是的话,则调用GLSL给了我们discard命令,即可丢弃这个片元,接下来不进行任何处理。
#version 330 core
out vec4 FragColor;
in vec2 TexCoords;
uniform sampler2D texture1;
void main()
{
vec4 texColor = texture(texture1, TexCoords);
if(texColor.a < 0.1)
discard;
FragColor = texColor;
}
效果:
切记:
需要将纹理的环绕方式设置为GL_CLAMP_TO_EDGE。使用GL_REPEAT模式,在采样上边缘时,会将上边缘与下边缘纯色值进行插值,从而得到错误的瑕疵。
透明度混合
混合
进行混合,首先当然需要打开混合功能。
glEnable(GL_BLEND);
混合方程:
: 源颜色向量。这是源自纹理的颜色向量。
: 目标颜色向量。这是当前储存在颜色缓冲中的颜色向量。
: 源因子值。指定了alpha值对源颜色的影响。
:目标因子值。指定了alpha值对目标颜色的影响。
因子:
因子设置函数:
void glBlendFunc(GLenum sfactor, GLenum dfactor);
void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
// 使用源颜色向量的alpha作为源因子,使用1−alpha作为目标因子
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 或者为RGB和alpha通道分别设置不同的选项,最终的alpha分量只受源颜色向量的alpha值所影响
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
运算符修改:
void glBlendEquation(GLenum mode);
渲染顺序
当渲染透明物体时,渲染顺序尤为重要,由于开启深度测试,若先渲染前面的透明物体,则会导致后面的透明物体无法通过透明度测试,从而导致渲染效果出现问题。
大致的渲染熟顺序如下:
1. 先绘制所有不透明的物体。
2. 从观察者视角获取物体的距离,对所有透明的物体排序。
3. 按从远到近的顺序绘制所有透明的物体。