本笔记仅为个人的理解,如果有误欢迎指出。
Bandwidth Efficient Graphics with ARM Mali GPUs
基于 ARM Mali GPU 的带宽高效图形技术
这是一篇介绍ARM为OpenGL ES 2.0 和 OpenGL ES 3.0 提供的一系列拓展技术,感觉像是API介绍说明,这篇文章不像是面向普通的游戏开发人员看的,像是给游戏引擎开发看的。
文章主要介绍两个方面的技术:
Shader Framebuffer Fetch Extensions 和 Shader Pixel Local Storage
Shader Framebuffer Fetch Extensions :
ARM在片段着色器拓展,允许在处理当前像素的时候可以读取现有的framebuffer颜色、深度和模板。
这里涉及到两个扩展:
GL_ARM_shader_framebuffer_fetch
GL_ARM_shader_framebuffer_fetch_depth_stencil
1,GL ARM shader framebuffer fetch
这个拓展允许片段着色器直接读取当前像素已经写入 Framebuffer 的颜色。这个实现原理是因为在移动端设备中,片段着色器写入的不是framebuffer,写入的是Tile Buffer,而Tile Buffer不是在显存中所以几乎没有额外的带宽消耗

2,GL_ARM_shader_framebuffer_fetch_depth_stencil
这个拓展允许片段着色器读取现有的framebuffer 深度和模板值,这使得许多依赖场景深度的屏幕空间技术可以实现,比如软粒子、可编程深度\模板测试、三维位置重建以及方差阴影贴图。
简单的软粒子实现:

简单的方差阴影实现:

Shader Pixel Local Storage :
Shader像素本地存储,OpenGL ES 3.0中提供了一种机制,使的同一个像素点的不同Fragment Shader之间能够传递信息。实现原理在于每个像素都有一个128 bit的 Shader Pixel Local Storage ,程序可以自己划分这空间的用途。可以看到 PLS 保存在 Tile - buffer 上

正常渲染流程:

使用了PLS的流程:

参考资料: