Fixed MLAA being a bit wrong

This commit is contained in:
korenkonder
2024-03-24 20:55:48 +03:00
parent def80834df
commit 1b8f181df2
+78 -40
View File
@@ -1791,41 +1791,41 @@ namespace rndr {
_data += MLAA_GRID_SIDE_LEN * 4 * 2;
}
}
static float_t calc_area_tex_val(int32_t a1, int32_t a2) {
float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5));
float_t v3 = (float_t)a1 * v2 + 0.5f;
if (a1 >= a2 - 1)
return (v3 * 0.5f) * 0.5f;
else
return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f;
};
static void calculate_mlaa_area_texture_data_inner(float_t* val_left,
float_t* val_right, int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright) {
auto calc_area_tex_val = [&](int32_t a1, int32_t a2) {
float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5));
float_t v3 = (float_t)a1 * v2 + 0.5f;
if (a1 >= a2 - 1)
return (v3 * 0.5f) * 0.5f;
else
return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f;
};
int32_t dist = dleft + dright + 1;
int32_t d = dleft + dright + 1;
float_t _val_left = 0.0f;
float_t _val_right = 0.0f;
switch (cross2) {
case 0:
switch (cross1) {
case 1:
_val_right = calc_area_tex_val(dleft, min_def(dist, MLAA_GRID_SIDE_LEN));
_val_right = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN));
break;
case 3:
_val_left = calc_area_tex_val(dleft, min_def(dist, MLAA_GRID_SIDE_LEN));
_val_left = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN));
break;
}
break;
case 1:
switch (cross1) {
case 0:
_val_right = calc_area_tex_val(dright, min_def(dist, MLAA_GRID_SIDE_LEN));
_val_right = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN));
break;
case 1:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_right = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1834,7 +1834,7 @@ namespace rndr {
_val_right = calc_area_tex_val(v15, v12) * 2.0f;
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft >= v12)
_val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f;
@@ -1843,10 +1843,9 @@ namespace rndr {
}
break;
case 3:
case 4:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_left = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1855,7 +1854,27 @@ namespace rndr {
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
else
_val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f;
}
break;
case 4:
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_left = calc_area_tex_val(dleft, v12);
else if (dright < v15)
_val_right = calc_area_tex_val(dright, v12);
else
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
@@ -1868,13 +1887,12 @@ namespace rndr {
case 3:
switch (cross1) {
case 0:
_val_left = calc_area_tex_val(dright, min_def(dist, MLAA_GRID_SIDE_LEN));
_val_left = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN));
break;
case 1:
case 4:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_right = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1883,7 +1901,7 @@ namespace rndr {
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
@@ -1892,9 +1910,9 @@ namespace rndr {
}
break;
case 3:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_left = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1903,7 +1921,7 @@ namespace rndr {
_val_left = calc_area_tex_val(v15, v12) * 2.0f;
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
@@ -1911,14 +1929,34 @@ namespace rndr {
_val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f;
}
break;
case 4:
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_right = calc_area_tex_val(dleft, v12);
else if (dright < v15)
_val_left = calc_area_tex_val(dright, v12);
else
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
else
_val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f;
}
break;
}
break;
case 4:
switch (cross1) {
case 1:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_right = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1927,7 +1965,7 @@ namespace rndr {
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;
@@ -1936,9 +1974,9 @@ namespace rndr {
}
break;
case 3:
if (dist % 2) {
int32_t v12 = dist / 2 + 1;
int32_t v15 = dist / 2;
if (d % 2) {
int32_t v12 = d / 2 + 1;
int32_t v15 = d / 2;
if (dleft < v15)
_val_left = calc_area_tex_val(dleft, v12);
else if (dright < v15)
@@ -1947,7 +1985,7 @@ namespace rndr {
_val_left = _val_right = calc_area_tex_val(v15, v12);
}
else {
int32_t v12 = dist / 2;
int32_t v12 = d / 2;
float_t v14 = -0.5f / (float_t)v12;
if (dleft < v12)
_val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;