1. glEnable(GL_BLEND);
  2. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GL_ZERO 因子等于00
GL_ONE 因子等于11
GL_SRC_COLOR 因子等于源颜色向量C¯sourceC¯source
GL_ONE_MINUS_SRC_COLOR 因子等于1−C¯source1−C¯source
GL_DST_COLOR 因子等于目标颜色向量C¯destinationC¯destination
GL_ONE_MINUS_DST_COLOR 因子等于1−C¯destination1−C¯destination
GL_SRC_ALPHA 因子等于C¯sourceC¯source的alphaalpha分量
GL_ONE_MINUS_SRC_ALPHA 因子等于1−1− C¯sourceC¯source的alphaalpha分量
GL_DST_ALPHA 因子等于C¯destinationC¯destination的alphaalpha分量
GL_ONE_MINUS_DST_ALPHA 因子等于1−1− C¯destinationC¯destination的alphaalpha分量
GL_CONSTANT_COLOR 因子等于常数颜色向量C¯constantC¯constant
GL_ONE_MINUS_CONSTANT_COLOR 因子等于1−C¯constant1−C¯constant
GL_CONSTANT_ALPHA 因子等于C¯constantC¯constant的alphaalpha分量
GL_ONE_MINUS_CONSTANT_ALPHA 因子等于1−1− C¯constantC¯constant的alphaalpha分量

问题:半透明和深度测试的矛盾——深度测试不知道半透明物体是透明的!——

不要打乱顺序

image.png

  1. 先绘制所有不透明的物体。
  2. 对所有透明的物体排序。
  3. 按顺序绘制所有透明的物体。

排序透明物体的一种方法是,从观察者视角获取物体的距离。这可以通过计算摄像机位置向量和物体的位置向量之间的距离所获得。接下来我们把距离和它对应的位置向量存储到一个STL库的map数据结构中。map会自动根据键值(Key)对它的值排序,所以只要我们添加了所有的位置,并以它的距离作为键,它们就会自动根据距离值排序了。