D3D: Depth range inversion.

Credits go to Galop1n for designing this technique and to BhaaLseN for cleaning up the commit.
This commit is contained in:
galop1n
2015-05-24 14:44:25 +02:00
committed by Jules Blok
parent 308b72d376
commit 2975e53091
6 changed files with 36 additions and 16 deletions

View File

@ -462,15 +462,19 @@ static void WriteZ8Encoder(char*& p, const char* multiplier,API_TYPE ApiType)
WRITE(p, " float depth;\n");
WriteSampleColor(p, "r", "depth", 0, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, "ocol0.b = frac(depth * %s);\n", multiplier);
WriteSampleColor(p, "r", "depth", 1, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, "ocol0.g = frac(depth * %s);\n", multiplier);
WriteSampleColor(p, "r", "depth", 2, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, "ocol0.r = frac(depth * %s);\n", multiplier);
WriteSampleColor(p, "r", "depth", 3, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, "ocol0.a = frac(depth * %s);\n", multiplier);
WriteEncoderEnd(p, ApiType);
@ -486,6 +490,7 @@ static void WriteZ16Encoder(char*& p,API_TYPE ApiType)
// byte order is reversed
WriteSampleColor(p, "r", "depth", 0, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, " depth = clamp(depth * 16777216.0, 0.0, float(0xFFFFFF));\n");
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
@ -496,6 +501,7 @@ static void WriteZ16Encoder(char*& p,API_TYPE ApiType)
WRITE(p, " ocol0.g = expanded.r / 255.0;\n");
WriteSampleColor(p, "r", "depth", 1, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, " depth = clamp(depth * 16777216.0, 0.0, float(0xFFFFFF));\n");
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
@ -518,6 +524,7 @@ static void WriteZ16LEncoder(char*& p,API_TYPE ApiType)
// byte order is reversed
WriteSampleColor(p, "r", "depth", 0, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, " depth = clamp(depth * 16777216.0, 0.0, float(0xFFFFFF));\n");
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
@ -530,6 +537,7 @@ static void WriteZ16LEncoder(char*& p,API_TYPE ApiType)
WRITE(p, " ocol0.g = expanded.g / 255.0;\n");
WriteSampleColor(p, "r", "depth", 1, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth = 1.0f - depth;\n");
WRITE(p, " depth = clamp(depth * 16777216.0, 0.0, float(0xFFFFFF));\n");
WRITE(p, " expanded.r = floor(depth / (256.0 * 256.0));\n");
@ -554,7 +562,9 @@ static void WriteZ24Encoder(char*& p, API_TYPE ApiType)
WRITE(p, " float3 expanded1;\n");
WriteSampleColor(p, "r", "depth0", 0, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth0 = 1.0f - depth0;\n");
WriteSampleColor(p, "r", "depth1", 1, ApiType);
if (ApiType == API_D3D) WRITE(p, "depth1 = 1.0f - depth1;\n");
for (int i = 0; i < 2; i++)
{