前面我们讲深度测试的时候说过,深度值大的会把深度值小的覆盖住
如下图 我们发现重叠的部分绿色把蓝色盖住了
(图1)
如果我们想实现下面的效果怎么办呢?
(图二)
我们可以用 混合 来实现这种方式
因为前面讲了很多Opgl绘制基本图元的方法,所有绘制两个矩形的代码我就不贴出来了,还是包括函数
int main(int argc, char* argv[])
void ChangeSize(int w, int h)
void SetupRC()
void RenderScene(void)
唯一的变化是RenderScene函数
下面我们来看一下RenderScene函数
我们先绘制两个矩形,也就是图一的代码
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//绘制蓝色的矩形
GLfloat vBlue[] = { 0.0f, 0.0f, 1.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlue);
greenBatch.Draw();
//绘制绿色的矩形
GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);
blueBatch.Draw();
glutSwapBuffers();
}
代码
glEnable(GL_BLEND);
标示开启 混合 功能
函数
glBlendFunc (GLenum sfactor, GLenum dfactor);
标示何值混合的模式
来看个具体的使用
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
标示以源颜色的alpha进行混合,混合方式是GL_ONE_MINUS_SRC_ALPHA
其中GL_ONE_MINUS_SRC_ALPHA 标示 的公式如下
Cf=(Cs * S)+(Cd*D)
其中 Cf标示最终的颜色,Cs标示源颜色,也就是后来绘制的颜色,我们这里是绿色(就是那个绿色矩形的颜色),S标示源颜色的alpha值,Cd标示目标颜色,就是现在屏幕上的颜色,D = (1-S)
图二的代码如下
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//绘制蓝色的矩形
GLfloat vBlue[] = { 0.0f, 0.0f, 1.0f, 1.0f };
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlue);
greenBatch.Draw();
//绘制绿色的矩形
GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 0.8f };
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vGreen);
blueBatch.Draw();
glDisable(GL_BLEND);
glutSwapBuffers();
}