说明:
该测试ES2.0的程序很简单,只有一个render()渲染方法.但是有一个不理解的地方就是当我把render()
中的glBlendFunc(  GL_SRC_ALPHA,  GL_ONE_MINUS_SRC_ALPHA  );
改成glBlendFunc(  GL_DST_ALPHA,  GL_ONE_MINUS_DST_ALPHA  );后,
效果却跟理论上的不一样.----------------------------------------------------------------------------------
m_Test3D只是一个白色的Alpha值为0.5的四边形.顶点和颜色数据如下:
float ONE = 1.0f;
m_pAttiVertex = new GLfloat[28] {
     -ONE, -ONE,  0, //0
        1.0f, 1.0f, 1.0f, 0.5f,
      ONE, -ONE,  0, //1
        1.0f, 1.0f, 1.0f, 0.5f,
      ONE,  ONE,  0, //2
        1.0f, 1.0f, 1.0f, 0.5f,
     -ONE,  ONE,  0, //3
        1.0f, 1.0f, 1.0f, 0.5f,
};//渲染函数
void render()
{
//用红色清屏
glClearColor( 1.0, 0.0, 0.0, 0.0 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glEnable( GL_BLEND );
glBlendFunc(  GL_SRC_ALPHA,  GL_ONE_MINUS_SRC_ALPHA  );
m_Test3D.DrawSelf();
glDisable( GL_BLEND );
}以上代码的结果如下图(如下).该结果正确没错(白色混合着背景红色):
改成
void render()
{
//用红色清屏
glClearColor( 1.0, 0.0, 0.0, 0.0 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );glEnable( GL_BLEND );
glBlendFunc(  GL_DST_ALPHA,  GL_ONE_MINUS_DST_ALPHA  );
m_Test3D.DrawSelf();
glDisable( GL_BLEND );
}
结果如下图.我认为按理论上说应该全屏都是红色,而实际结果如下,无法理解为什么还是纯白色矩形呢?绘制顺序依上看
是先用红色清屏,再绘白色矩形.那在glBlendFunc参数的概念里,背景色就是目标.白色矩形就是源
按理论来说第一个参数是源因子取值为GL_DST_ALPHA,即是指以目标(红色背景的ALHAP值为0)的ALPHA值作为源因子,即源因子为0.0, 那源色计算结果是: 源色(白色) * 源因子 = 源色(白色) * 0 = ( 0, 0, 0, 0 ).即(透明黑色).
第二个参数是目标因子取值为GL_ONE_MINUS_DST_ALPHA,即是指以( 1.0 - 目标色的ALPHA值)作为目标因子,即目标因子为:(1.0 - 0.0) = 1.0, 那目标色计算结果是: 目标色(红色) * 1.0 = (1.0, 0, 0, 0 )红色.
那混合后的效果是 源色(白色)*0.0 + 目标色(红色)*1.0 = ( 0, 0, 0, 0 ) + (1.0, 0, 0, 0 ) = (1.0, 0, 0, 0 ),即红色. 应该是全屏红色才对.怎么实际结果还是有个纯白色矩形呢.难道说GL_DST_ALPHA获取的ALPHA是1.0吗?但我 glClearColor( 1.0, 0.0, 0.0, 0.0 );明明指的ALPHA是0.0啊.求教何解?OpenGL ES