混合过程中可以通过glBlendFunc设定对应的混合方式,常见的混合模式如下: /* BlendingFactorDest */ #define GL_ZERO 的原型是 ``` void glBlendFunc(GLenum sfactor, GLenum dfactor); ``` [glBlendFunc](http://www.khronos.org /registry/OpenGL-Refpages/es2.0/xhtml/glBlendFunc.xml)的第两个参数分别是src因子和dst因子; src颜色指的是当前绘制颜色; dst颜色指的是当前已有颜色 ; 使用glBlendFunc,需要通过`glEnable`开启blend功能。 demo中使用的是 ``` glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ``` 混合方式用数学公式来描述就是
蒙板就好像隔着雕花墙往里面看的效果一样 具体步骤:1雕花墙是一个纹理,墙体为彩色,镂空地方为黑色,预先给它生成一个一样的黑白纹理,使镂空的地方为白色,墙体为黑色 2.画墙内的景色 3 glBlendFunc 4 glBlendFunc(GL_ONE, GL_ONE); 画雕花墙的纹理 画雕花墙镂空的地方为黑色,则使用原想色颜色,上步渲染中,镂空地方为原墙内景色。墙体部分 = 现颜色 + 第3步后的颜色。 3 偏移逆转图,计算纹理偏移量时,主要用到切空间的概念 a 由灯的位置减去当前顶点的位置,结果归一化得向量v, b 把向量v投影到切空间 c 按向量v在切空间的投影偏移纹理坐标 4 glBlendFunc (GL_ONE,GL_ONE)贴逆转图 5 glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR)贴原图
glEnable(GL_BLEND); // 开启颜色混合 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 设置颜色混合模式 glDisable (GL_BLEND); // 关闭颜色混合 3.1、颜色混合模式 在开启了颜色混合后,还需要通过 glBlendFunc 函数指定混合模式。 glBlendFunc 函数的参数可以理解为混合因子,第一个参数代表源颜色混合因子,第二个参数代表目标颜色混合因子。 对于预乘后的图片,我们做混合情况下需要使用 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA),因为源颜色已经乘过了。 对于没有预乘的图片,我们做混合情况下需要使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),这种方式会进行源颜色乘法。 - 完 -
然后通过 glBlendFunc;设置混合的方式,其中 sfactor 表示源因子,dfactor 表示目标因子。 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_SRC_ALPHA 表示源因子取值为源颜色的 alpha GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); //启动混合,设置混合因子 glEnable(GL_BLEND); glBlendFunc
然后通过 glBlendFunc;设置混合的方式,其中 sfactor 表示源因子,dfactor 表示目标因子。 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_SRC_ALPHA 表示源因子取值为源颜色的 alpha GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); //启动混合,设置混合因子 glEnable(GL_BLEND); glBlendFunc
R、G、B、A表示: 红、绿、蓝、透明度 S、D表示: 源、目标 C 代表常量(一般为黑色) 几种参数尝试 //使用默认参数的情况 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA //使用其他参数的情况 glBlendFunc(GL_CONSTANT_ALPHA, GL_CONSTANT_ALPHA); ?
源因子和目标因子可以通过glBlendFunc函数来进行设置。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。 以最常用的glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA )为例: 若源色为 ( 1.0 , 0.9 , 0.7 , 0.8 ),源色使用 GL_SRC_ALPHA 我们举个简单的例子,假设我们设置了OpenGL混合模式为glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ),我们希望源色的占比为alpha,即RGB_new OpenGL混合时不再乘以alpha值 在没有做预乘时,我们设置的OpenGL混合模式因子为glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ),即源色 RGB值会乘以alpha值,但是因为Bitmap在解码时已经做了预乘操作,所以源色混合因子不需要再乘以alpha值,此时我们可以设置OpenGL混合模式为glBlendFunc( ONE , GL_ONE_MINUS_SRC_ALPHA
六、相交区域的混合着色 glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的。 将多边形从远至近排列,并使用以下函数 glBlendFunc( GL_SRC_ALPHA_SATURATE , GL_ONE ); glEnable( GL_POLYGON_SMOOTH ); 可以优化多边形反走样 GL_TRUE; /* Initialize alpha blending function. */ static void init(void) { glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_ONE, GL_ONE); glShadeModel (GL_FLAT);
1 glEnable(GL_BLEND); 2 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 3 // 绘制 drawSelf(mOriginTextureId) 5 if (isBlend) { 6 glEnable(GL_BLEND); 7 glBlendFunc
这里的计算公式是根据OpenGL中的颜色混合参数得到的:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),如果对这个公式陌生可以看看这篇文章:OpenGL
drawSomething(yRot); } 地板 void RenderScene(void) { //开启混合功能(绘制地板) glEnable(GL_BLEND); //指定glBlendFunc 颜色混合方程式 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //绑定创建好的第一个纹理对象用于绘制 glBindTexture
lightSpecular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat lightPosition[] = { 0.5, 0.5, 4.0, 0.0 }; glBlendFunc
float blue, 5 float alpha 6 ); 设置混合的方法 有了混合因子,接下来就是设置混合因子了,OpenGL 提供了如下方法来设置: 方法签名 说明 glBlendFunc 开启颜色混合进行绘制 3 GLES20.glEnable(GLES20.GL_BLEND) 4 // 设置混合因子 5 GLES20.glBlendFunc
源因子和目标因子是可以通过glBlendFunc函数来进行设置的。**glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。**这两个参数可以是多种值,下面介绍比较常用的几种。 举例来说: 1️⃣ 如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。 2️⃣ 如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。 4️⃣ 如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。 先来看看使用glBlendFunc(GL_ONE, GL_ZERO);的,它的结果与不使用混合时相同。
void onSurfaceCreated() { //启用透明 GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc //启用透明 GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA
接口使用:渲染半透明纹理API调用上很简单,两行代码 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2.
set a blending function appropriate for premultiplied alpha pixel data glEnable(GL_BLEND); glBlendFunc
gluPerspective(60,w/h,1,200); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void myInit() { glBlendFunc
//开启混合 glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA); //使用新的着色器程序 glUseProgram 外层的绘制 glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA); //切换另外一个着色器程序
glEnable(GL_LINE_SMOOTH); //启用抗锯齿效果 glHint(GL_LINE_SMOOTH,GL_NICEST); //指定混合函数 glBlendFunc