OpenGL中的混合是通过下面这个方程来实现的:
:源颜色向量。这是源自纹理的颜色向量。
:目标颜色向量。这是当前储存在颜色缓冲中的颜色向量。
:源因子值。指定了alpha值对源颜色的影响。
:目标因子值。指定了alpha值对目标颜色的影响。
虽然都是这样
glBlendFunc(GLenum sfactor, GLenum dfactor)函数接受两个参数,来设置源和目标因子。OpenGL为我们定义了很多个选项,我们将在下面列出大部分最常用的选项。注意常数颜色向量可以通过glBlendColor函数来另外设置。
选项 值
GL_ZERO 因子等于
GL_ONE 因子等于
GL_SRC_COLOR 因子等于源颜色向量
GL_ONE_MINUS_SRC_COLOR 因子等于
GL_DST_COLOR 因子等于目标颜色向量
GL_ONE_MINUS_DST_COLOR 因子等于
GL_SRC_ALPHA 因子等于的分量
GL_ONE_MINUS_SRC_ALPHA 因子等于 的分量
GL_DST_ALPHA 因子等于的分量
GL_ONE_MINUS_DST_ALPHA 因子等于 的分量
GL_CONSTANT_COLOR 因子等于常数颜色向量
GL_ONE_MINUS_CONSTANT_COLOR 因子等于
GL_CONSTANT_ALPHA 因子等于的分量
GL_ONE_MINUS_CONSTANT_ALPHA 因子等于 的分量
这个在cg里有不想多说
也可以使用glBlendFuncSeparate为RGB和alpha通道分别设置不同的选项:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
这个就RGB分开设置
glBlendEquation(GLenum mode)允许我们设置运算符,它提供了三个选项:
GL_FUNC_ADD:默认选项,将两个分量相加:。
GL_FUNC_SUBTRACT:将两个分量相减: 。
GL_FUNC_REVERSE_SUBTRACT:将两个分量相减,但顺序相反:。
这个是设置运算模式的,默认是源x源factor加目标x目标factor
简单的排序
std::map<float, glm::vec3> sorted;
for (unsigned int i = 0; i < windows.size(); i++)
{
float distance = glm::length(camera.Position - windows[i]);
sorted[distance] = windows[i];
}
结果就是一个排序后的容器对象,它根据distance键值从低到高储存了每个窗户的位置。
之后,这次在渲染的时候,我们将以逆序(从远到近)从map中获取值,之后以正确的顺序绘制对应的窗户:
for(std::map<float,glm::vec3>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); ++it)
{
model = glm::mat4();
model = glm::translate(model, it->second);
shader.setMat4("model", model);
glDrawArrays(GL_TRIANGLES, 0, 6);
}