混合
混合不同物体的多种颜色为一种颜色,所以透明度能让我们看穿物体,透明度一般由alpha颜色值来决定的,透明度为1-alpha值。
- 首先试着使用有一部分透明的草贴图.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);//用来说明现在可以使用alpha通道.
//着色器中也要保证取4个颜色分量:
void main()
{
// FragColor = vec4(vec3(texture(texture1, TexCoords)), 1.0);
FragColor = texture(texture1, TexCoords);
}
//opengl默认不知道如何处理alpha值,因此可以在着色器中使用:
if(texColor.a < 0.1)
discard;
- 除了直接丢弃片段外,可以启用混合
glEnable(GL_BLEND);
混合方程为Color(result)=源颜色源因子值+目标颜色目标因子值。实现混合效果的因子值设置:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
一般来说只有相加,如果需要相减可以使用这个glBlendEquation(GLenum mode)
ps:头疼的问题:深度测试和混合的叠加,当你先把近处的玻璃放上去,之后再放后面的玻璃会出现如下问题:
边框上会出现问题,这时我们应该先将远处的渲染出来之后再渲染近处的,按照顺序,最好按照如下顺序:
- 先绘制所有不透明的
- 对所有透明的物体排序,可以把距离作为键值存在stl的map中,会自动进行排序。
- 按照顺序绘制透明的
排序不是一个很完美的想法,更高级的有次序无关透明度
面剔除
为了将用户看不见的面去除,只渲染用户看得到的画面,三角形环绕顺序,逆时针顶点所定义的三角形会被处理为正向三角形。glEnable(GL_CULL_FACE);
此时所有的正面都要定义为逆时针的坐标。
帧缓冲
帧缓冲包括颜色缓冲,深度缓冲,和模板缓冲,被储存在内存中,而我们可以定义自己的帧缓冲。
//和前面的操作一样,需要进行绑定
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
可以使用GL_READ_FRAMEBUFFER或GL_DRAW_FRAMEBUFFER将帧缓冲绑定到读取目标或写入目标,一般可以不区分,直接使用GL_FRAMEBUFFER绑定到两个上
通过判断glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE
可以知道帧缓冲是否是完整的,帧缓冲需要被绑定才激活才能有视觉效果,所以可以把它绑定到0,所有glBindFramebuffer(GL_FRAMEBUFFER, 0);
。
附件可以有两个选项:纹理或渲染缓冲对象。
通过使用帧缓冲可以在着色器中进行转换,实现反相,后期处理,灰度,核效果等功能.