FXAA特点
FXAA全程是Fast Approximate Anti-Aliasing,指的是快速近似抗锯齿,特点是处理速度快,方便整合在后处理的渲染管线。
- FXAA计算范围与MSAA或者SAA不同,MSAA发生在光栅化的阶段,而FXAA是借助延迟渲染的技术,只对全屏的像素进行处理。
- FXAA计算速度较快,一方面由于只计算屏幕像素,范围比MSAA少而更快;另一方面应用简单的边缘检测及梯度计算实现平滑效果。
计算步骤
这里主要说明场景已渲染至Framebuffer的texture的渲染对象之后,FXAA的Fragment Shader如何进行边缘锯齿的平滑:
根据个人理解,总体步骤可以分为:1)计算当前像素点和相邻像素的灰度值 2) 边缘判断:通过灰度最大值与灰度最小值的差距来判定 3)计算采样方向:x和y方向的梯度作为采样方向,同时考虑brightness的影响 4)采样及平均:分两种情况一种是Inner Sample,正负1/6方向;另一种情况是Outer Sample,在正负1/2方向上
Shader编写
具体GLSL代码见下面:
- 采集NW、NE、SW、SE四个方位的rgb值,并转化为灰度值luma
// 当前像素的rgb值
vec3 CurrentPixel = texture(colorTexture,texCoord).rgb;
//获取四个对角方位的rgb值
vec3 NW = textureOffset(colorTexture, texCoord, ivec2(-1,1)).rgb;
vec3 NE = textureOffset(colorTexture, texCoord, ivec2(1,1)).rgb;
vec3 SW = textureOffset(colorTexture, texCoord, ivec2(-1,-1)).rgb;
vec3 SE = textureOffset(colorTexture, texCoord,