Do not use extra uv for mlaa

This commit is contained in:
Vincent Lejeune
2015-02-24 22:08:49 +01:00
parent af265f8345
commit 419b96c068
6 changed files with 28 additions and 41 deletions

View File

@@ -4,8 +4,6 @@ uniform sampler2D areaMap;
#define MAX_SEARCH_STEPS 8.0
#define MAX_DISTANCE 33.0
in vec2 uv;
out vec4 FragColor;
/**
@@ -75,6 +73,7 @@ vec2 Area(vec2 distance, float e1, float e2) {
void main() {
vec4 areas = vec4(0.0);
vec2 uv = gl_FragCoord.xy / screen;
vec2 e = texture(edgesMap, uv).rg;

View File

@@ -1,8 +1,5 @@
uniform sampler2D colorMapG;
in vec4 offset[2];
in vec2 uv;
const float threshold = 0.1;
out vec4 FragColor;
@@ -10,14 +7,20 @@ out vec4 FragColor;
void main() {
vec3 weights = vec3(0.2126,0.7152, 0.0722); // ITU-R BT. 709
vec2 uv = gl_FragCoord.xy / screen;
vec2 uv_left = uv + vec2(-1., 0.) / screen;
vec2 uv_top = uv + vec2(0., 1.) / screen;
vec2 uv_right = uv + vec2(1., 0.) / screen;
vec2 uv_bottom = uv + vec2(0., -1.) / screen;
/**
* Luma calculation requires gamma-corrected colors:
*/
float L = dot(texture(colorMapG, uv).rgb, weights);
float Lleft = dot(texture(colorMapG, offset[0].xy).rgb, weights);
float Ltop = dot(texture(colorMapG, offset[0].zw).rgb, weights);
float Lright = dot(texture(colorMapG, offset[1].xy).rgb, weights);
float Lbottom = dot(texture(colorMapG, offset[1].zw).rgb, weights);
float Lleft = dot(texture(colorMapG, uv_left).rgb, weights);
float Ltop = dot(texture(colorMapG, uv_top).rgb, weights);
float Lright = dot(texture(colorMapG, uv_right).rgb, weights);
float Lbottom = dot(texture(colorMapG, uv_bottom).rgb, weights);
vec4 delta = abs(vec4(L) - vec4(Lleft, Ltop, Lright, Lbottom));
vec4 edges = step(vec4(threshold), delta);

View File

@@ -1,16 +1,19 @@
uniform sampler2D blendMap;
uniform sampler2D colorMap;
in vec4 offset[2];
in vec2 uv;
out vec4 FragColor;
void main() {
vec2 uv = gl_FragCoord.xy / screen;
vec2 uv_left = uv + vec2(-1., 0.) / screen;
vec2 uv_top = uv + vec2(0., 1.) / screen;
vec2 uv_right = uv + vec2(1., 0.) / screen;
vec2 uv_bottom = uv + vec2(0., -1.) / screen;
// Fetch the blending weights for current pixel:
vec4 topLeft = texture(blendMap, uv);
float bottom = texture(blendMap, offset[1].zw).g;
float right = texture(blendMap, offset[1].xy).a;
float bottom = texture(blendMap, uv_bottom).g;
float right = texture(blendMap, uv_right).a;
vec4 a = vec4(topLeft.r, bottom, topLeft.b, right);
// Up to 4 lines can be crossing a pixel (one in each edge). So, we perform
@@ -27,10 +30,10 @@ void main() {
// Add the contributions of the possible 4 lines that can cross this pixel:
vec4 C = texture(colorMap, uv);
vec4 Cleft = texture(colorMap, offset[0].xy);
vec4 Ctop = texture(colorMap, offset[0].zw);
vec4 Cright = texture(colorMap, offset[1].xy);
vec4 Cbottom = texture(colorMap, offset[1].zw);
vec4 Cleft = texture(colorMap, uv_left);
vec4 Ctop = texture(colorMap, uv_top);
vec4 Cright = texture(colorMap, uv_right);
vec4 Cbottom = texture(colorMap, uv_bottom);
color = mix(C, Ctop, a.r) * w.r + color;
color = mix(C, Cbottom, a.g) * w.g + color;
color = mix(C, Cleft, a.b) * w.b + color;

View File

@@ -600,10 +600,7 @@ void PostProcessing::applyMLAA()
// Pass 1: color edge detection
glUseProgram(FullScreenShader::MLAAColorEdgeDetectionSHader::getInstance()->Program);
FullScreenShader::MLAAColorEdgeDetectionSHader::getInstance()->SetTextureUnits(irr_driver->getRenderTargetTexture(RTT_MLAA_COLORS));
FullScreenShader::MLAAColorEdgeDetectionSHader::getInstance()->setUniforms(PIXEL_SIZE);
glBindVertexArray(FullScreenShader::MLAAColorEdgeDetectionSHader::getInstance()->vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
DrawFullScreenEffect<FullScreenShader::MLAAColorEdgeDetectionSHader>(PIXEL_SIZE);
glStencilFunc(GL_EQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
@@ -614,10 +611,7 @@ void PostProcessing::applyMLAA()
glUseProgram(FullScreenShader::MLAABlendWeightSHader::getInstance()->Program);
FullScreenShader::MLAABlendWeightSHader::getInstance()->SetTextureUnits(irr_driver->getRenderTargetTexture(RTT_MLAA_TMP), getTextureGLuint(m_areamap));
FullScreenShader::MLAABlendWeightSHader::getInstance()->setUniforms(PIXEL_SIZE);
glBindVertexArray(FullScreenShader::MLAABlendWeightSHader::getInstance()->vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
DrawFullScreenEffect<FullScreenShader::MLAABlendWeightSHader>(PIXEL_SIZE);
// Blit in to tmp1
FrameBuffer::Blit(irr_driver->getFBO(FBO_MLAA_COLORS), irr_driver->getFBO(FBO_MLAA_TMP));
@@ -627,10 +621,7 @@ void PostProcessing::applyMLAA()
glUseProgram(FullScreenShader::MLAAGatherSHader::getInstance()->Program);
FullScreenShader::MLAAGatherSHader::getInstance()->SetTextureUnits(irr_driver->getRenderTargetTexture(RTT_MLAA_BLEND), irr_driver->getRenderTargetTexture(RTT_MLAA_TMP));
FullScreenShader::MLAAGatherSHader::getInstance()->setUniforms(PIXEL_SIZE);
glBindVertexArray(FullScreenShader::MLAAGatherSHader::getInstance()->vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
DrawFullScreenEffect<FullScreenShader::MLAAGatherSHader>(PIXEL_SIZE);
// Done.
glDisable(GL_STENCIL_TEST);

View File

@@ -1995,12 +1995,11 @@ namespace FullScreenShader
MLAAColorEdgeDetectionSHader::MLAAColorEdgeDetectionSHader()
{
Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/mlaa_offset.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/mlaa_color1.frag").c_str());
AssignUniforms("PIXEL_SIZE");
AssignSamplerNames(Program, 0, "colorMapG");
vao = createVAO(Program);
}
MLAABlendWeightSHader::MLAABlendWeightSHader()
@@ -2011,18 +2010,16 @@ namespace FullScreenShader
AssignUniforms("PIXEL_SIZE");
AssignSamplerNames(Program, 0, "edgesMap", 1, "areaMap");
vao = createVAO(Program);
}
MLAAGatherSHader::MLAAGatherSHader()
{
Program = LoadProgram(OBJECT,
GL_VERTEX_SHADER, file_manager->getAsset("shaders/mlaa_offset.vert").c_str(),
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/mlaa_neigh3.frag").c_str());
AssignUniforms("PIXEL_SIZE");
AssignSamplerNames(Program, 0, "blendMap", 1, "colorMap");
vao = createVAO(Program);
}
}

View File

@@ -635,24 +635,18 @@ public:
class MLAAColorEdgeDetectionSHader : public ShaderHelperSingleton<MLAAColorEdgeDetectionSHader, core::vector2df>, public TextureRead<Nearest_Filtered>
{
public:
GLuint vao;
MLAAColorEdgeDetectionSHader();
};
class MLAABlendWeightSHader : public ShaderHelperSingleton<MLAABlendWeightSHader, core::vector2df>, public TextureRead<Bilinear_Filtered, Nearest_Filtered>
{
public:
GLuint vao;
MLAABlendWeightSHader();
};
class MLAAGatherSHader : public ShaderHelperSingleton<MLAAGatherSHader, core::vector2df>, public TextureRead<Nearest_Filtered, Nearest_Filtered>
{
public:
GLuint vao;
MLAAGatherSHader();
};