Do not use extra uv for mlaa
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user