多重采样MSAA

GLSurfaceView设置多重采样

/*** 抗锯齿EGLConfigChooser** author weiss* email kleinminamo@gmail.com* created 2018/7/3.*/
public class MSAAConfigChooser implements GLSurfaceView.EGLConfigChooser {@Overridepublic EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {int attribs[] = {EGL10.EGL_LEVEL, 0,EGL10.EGL_RENDERABLE_TYPE, 4,  // EGL_OPENGL_ES2_BITEGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER,EGL10.EGL_RED_SIZE, 8,EGL10.EGL_GREEN_SIZE, 8,EGL10.EGL_BLUE_SIZE, 8,EGL10.EGL_DEPTH_SIZE, 24,EGL10.EGL_SAMPLE_BUFFERS, 1,EGL10.EGL_SAMPLES, 4,  // 在这里修改MSAA的倍数,4就是4xMSAA,再往上开程序可能会崩EGL10.EGL_NONE};EGLConfig[] configs = new EGLConfig[1];int[] configCounts = new int[1];egl.eglChooseConfig(display, attribs, configs, 1, configCounts);if (configCounts[0] == 0) {// Failed! Error handling.return null;} else {return configs[0];}}
}
复制代码

开启MULTISAMPLE

GLES20.glEnable(GL10.GL_MULTISAMPLE);
复制代码

后处理FXAA Shader

#ifndef FXAA_REDUCE_MIN#define FXAA_REDUCE_MIN   (1.0/ 128.0)
#endif
#ifndef FXAA_REDUCE_MUL#define FXAA_REDUCE_MUL   (1.0 / 8.0)
#endif
#ifndef FXAA_SPAN_MAX#define FXAA_SPAN_MAX     8.0
#endif//optimized version for mobile, where dependent
//texture reads can be a bottleneck
vec4 fxaa(sampler2D tex, vec2 fragCoord, vec2 resolution,vec2 v_rgbNW, vec2 v_rgbNE,vec2 v_rgbSW, vec2 v_rgbSE,vec2 v_rgbM) {vec4 color;mediump vec2 inverseVP = vec2(1.0 / resolution.x, 1.0 / resolution.y);vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;vec3 rgbSW = texture2D(tex, v_rgbSW).xyz;vec3 rgbSE = texture2D(tex, v_rgbSE).xyz;vec4 texColor = texture2D(tex, v_rgbM);vec3 rgbM  = texColor.xyz;vec3 luma = vec3(0.299, 0.587, 0.114);float lumaNW = dot(rgbNW, luma);float lumaNE = dot(rgbNE, luma);float lumaSW = dot(rgbSW, luma);float lumaSE = dot(rgbSE, luma);float lumaM  = dot(rgbM,  luma);float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));mediump vec2 dir;dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *(0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),dir * rcpDirMin)) * inverseVP;vec3 rgbA = 0.5 * (texture2D(tex, fragCoord * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz +texture2D(tex, fragCoord * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);vec3 rgbB = rgbA * 0.5 + 0.25 * (texture2D(tex, fragCoord * inverseVP + dir * -0.5).xyz +texture2D(tex, fragCoord * inverseVP + dir * 0.5).xyz);float lumaB = dot(rgbB, luma);if ((lumaB < lumaMin) || (lumaB > lumaMax))color = vec4(rgbA, texColor.a);elsecolor = vec4(rgbB, texColor.a);return color;
}
复制代码

特别注意用了后处理FBO,多重采样会失效,离屏渲染需要对FBO进行多重采样

FBO

    const char* __glExtensions = (const char*)glGetString(GL_EXTENSIONS);if(strstr(__glExtensions, "GL_IMG_multisampled_render_to_texture")){if(glFramebufferTexture2DMultisampleIMG_ == NULL){glFramebufferTexture2DMultisampleIMG_ = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC )eglGetProcAddress ( "glFramebufferTexture2DMultisampleIMG" );}}else if(strstr(__glExtensions, "GL_EXT_multisampled_render_to_texture")){if(glFramebufferTexture2DMultisampleIMG_ == NULL){glFramebufferTexture2DMultisampleIMG_ = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC )eglGetProcAddress ( "glFramebufferTexture2DMultisampleEXT" );}}//glFramebufferTexture2DMultisampleIMG_if(_multiSample){GL_ASSERT( glFramebufferTexture2DMultisampleIMG_(GL_FRAMEBUFFER, attachment, textureTarget, _renderTargets[index]->getTexture()->getHandle(), 0, 4););} else{GL_ASSERT( glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, textureTarget, _renderTargets[index]->getTexture()->getHandle(), 0));}
复制代码
RBO
    const char* __glExtensions = (const char*)glGetString(GL_EXTENSIONS);if(strstr(__glExtensions, "GL_IMG_multisampled_render_to_texture")){if(glRenderbufferStorageMultisampleIMG_ == NULL){glRenderbufferStorageMultisampleIMG_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC )eglGetProcAddress ( "glRenderbufferStorageMultisampleIMG" );}}else if(strstr(__glExtensions, "GL_EXT_multisampled_render_to_texture")){if(glRenderbufferStorageMultisampleIMG_ == NULL){glRenderbufferStorageMultisampleIMG_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC )eglGetProcAddress ( "glRenderbufferStorageMultisampleEXT" );}}//glRenderbufferStorageMultisampleIMG_glRenderbufferStorageMultisampleIMG_(GL_RENDERBUFFER, 4,GL_DEPTH24_STENCIL8, width, height); // w width, h height.
复制代码

转载于:https://juejin.im/post/5c89f7b8e51d453b5a68ffee

Android OpenGL ES抗锯齿相关推荐

  1. android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...

    源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...

  2. Android OpenGL ES 开发教程(20):颜色Color

    OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...

  3. OpenGl文章 Android OpenGL ES 简明开发教程

    Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...

  4. Android OpenGL ES 开发教程(16):Viewing和Modeling(MODELVIEW) 变换

    Viewing和Modeling 变换关系紧密,对应到相机拍照为放置三角架和调整被拍物体位置及角度,通常将这两个变换使用一个modelview 变换矩阵来定义.对于同一个坐标变换,可以使用不同的方法来 ...

  5. Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .

    有了前面关于Android OpenGL ES的介绍,可以开始创建示例程序OpenGLDemos. 使用Eclipse 创建一个Android项目 Project Name: OpenGLDemos ...

  6. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

  7. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android OpenGL ES 从入门到精通系统性学习教程

    1 为什么要写这个教程 目前这个 OpenGL ES 极简教程的更新暂时告一段落,在此之前,很荣幸获得了阮一峰老师的推荐. 因为在工作中频繁使用 OpenGL ES 做一些特效.滤镜之类的效果,加上平 ...

  9. Android OpenGL ES 画出三棱锥

    如今VR这么火,感觉有必要学学OpenGL.什么是OpenGL ES ,OpenGL ES (OpenGL for Embedded System ) 为适用于嵌入式系统的一个免费二维和三维图形库.O ...

最新文章

  1. java 后端校验_如何实现Java后端数据校验?看这篇就足够!
  2. Mybatis增删改
  3. 基于内容和用户画像的个性化推荐
  4. 12864液晶中文资料JHD529m1
  5. soapUI Pro 4.5.1的新破解方案
  6. 《少有人走的路——心智成熟的旅程》读书笔记
  7. 快捷方式图标变成白色
  8. 小白神器 - Django - 起步
  9. 000webhost – 1500M支持PHP可绑米免费虚拟主机
  10. SNP(单核苷酸多态性)准确性的验证,你造吗?
  11. 华为设备配置BGP负载分担
  12. 不用管别人怎么评论自己_如何面对别人对自己的评价?
  13. linux寄存器位运算,位运算的一些操作
  14. MissileDatcom 导弹气动计算
  15. registration status: 204
  16. 元认知是认知的监督体系
  17. 谷歌背后的强权人物——首席法律官肯特·沃克
  18. 189邮箱收发件服务器,189邮箱怎么发短信(189免费发短信的方法)
  19. java 微博客户端,Java新浪微博客户端开发第二步
  20. 平均数,中位数和众数

热门文章

  1. 呢篇唔系教程 -- 记录自己第一次Android刷机
  2. show status 优化mysql_mysql优化--show status
  3. html简单网页代码表白_表白网页代码,不会代码也可以操作,告别单身
  4. linux数据被删了怎么办
  5. 首个沉浸式云原生 Serverless 技术实践营开启报名
  6. 深度解读 OpenYurt :边缘自治能力设计解析
  7. 从零开始入门 K8s | 手把手带你理解 etcd
  8. git config设置用户名_hexo和git搭建博客过程
  9. 大学物理光学思维导图_思维导图走进新华百货现代物流
  10. 选购商用计算机任务书,计算机网络综合实习任务书-.doc