opengles2.0关于混合的不解之迷

warpo 2013-07-29 12:33:13
说明:
该测试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啊.

求教何解?
...全文
111 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
warpo 2013-08-04
  • 打赏
  • 举报
回复
算了.执着到最后,自己解决了.结贴.

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧