- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了该FxAA着色器,该着色器具有抗锯齿功能,并且工作得很好。
但是,莫名其妙地无法理解其逻辑。有人可以解释吗?
[[FX]]
// Samplers
sampler2D buf0 = sampler_state {
Address = Clamp;
Filter = None;
};
context FXAA {
VertexShader = compile GLSL VS_FSQUAD;
PixelShader = compile GLSL FS_FXAA;
}
[[VS_FSQUAD]]
uniform mat4 projMat;
attribute vec3 vertPos;
varying vec2 texCoords;
void main(void) {
texCoords = vertPos.xy;
gl_Position = projMat * vec4( vertPos, 1 );
}
[[FS_FXAA]]
uniform sampler2D buf0;
uniform vec2 frameBufSize;
varying vec2 texCoords;
void main( void ) {
//gl_FragColor.xyz = texture2D(buf0,texCoords).xyz;
//return;
float FXAA_SPAN_MAX = 8.0;
float FXAA_REDUCE_MUL = 1.0/8.0;
float FXAA_REDUCE_MIN = 1.0/128.0;
vec3 rgbNW=texture2D(buf0,texCoords+(vec2(-1.0,-1.0)/frameBufSize)).xyz;
vec3 rgbNE=texture2D(buf0,texCoords+(vec2(1.0,-1.0)/frameBufSize)).xyz;
vec3 rgbSW=texture2D(buf0,texCoords+(vec2(-1.0,1.0)/frameBufSize)).xyz;
vec3 rgbSE=texture2D(buf0,texCoords+(vec2(1.0,1.0)/frameBufSize)).xyz;
vec3 rgbM=texture2D(buf0,texCoords).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)));
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)) / frameBufSize;
vec3 rgbA = (1.0/2.0) * (
texture2D(buf0, texCoords.xy + dir * (1.0/3.0 - 0.5)).xyz +
texture2D(buf0, texCoords.xy + dir * (2.0/3.0 - 0.5)).xyz);
vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (
texture2D(buf0, texCoords.xy + dir * (0.0/3.0 - 0.5)).xyz +
texture2D(buf0, texCoords.xy + dir * (3.0/3.0 - 0.5)).xyz);
float lumaB = dot(rgbB, luma);
if((lumaB < lumaMin) || (lumaB > lumaMax)){
gl_FragColor.xyz=rgbA;
}else{
gl_FragColor.xyz=rgbB;
}
}
最佳答案
FxAA是对图像执行抗锯齿的过滤器算法。与其他AA技术相反,它应用于图像的像素,而不是在绘制图元时使用。在游戏等3D应用程序中,它作为后期处理步骤应用于渲染场景的顶部。
基本思想是:寻找垂直和水平边缘。如果在边缘的末端,则在正交方向上模糊。
这是关于该主题的good description和original paper。
关于opengl - 这个简单的FxAA如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105330/
我是一名计算机科学专业的学生,目前正在为我的类(class)作业制作一个 2d 游戏。我知道这有点不必要,但我尝试为游戏的 AA 实现 FXAA 算法。我使用的着色器是这个,因为我认为只使用一个简
我有一个包含 3d 模型、地面和网格的 three.js 项目。使用 outlinePass ( https://threejs.org/examples/?q=outl#webgl_postproc
在这个简单的测试场景中,我需要将 SSAO 和 FXAA 效果组合在一起,但我无法让它工作。启用 SSAO 后,如果我还启用 FXAA,渲染会变黑。 在 fiddle 中,如果取消注释composer
遇到了来自 NVidia 的 FxAA 实现。 http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhiteP
我正在尝试在同一 Canvas 和渲染器上渲染多个场景。一切都按预期工作,直到我将 FXAA 着色器添加到我的其中一个 Composer 中并且没有任何渲染。 该 Composer 适用于我的第二个场
我使用 Three.js StereoEffect 创建了一个 Google Cardboard 场景 effect = new THREE.StereoEffect(renderer); effec
我正在编写的应用程序中使用此示例项目的 XNA 4.0 表单控件:http://creators.xna.com/en-US/sample/winforms_series1 如果您不熟悉 FXAA,请
我是一名优秀的程序员,十分优秀!