mirror of
https://github.com/Redot-Engine/redot-engine.git
synced 2025-12-06 07:17:42 -05:00
Merge pull request #104768 from Rudolph-B/Issue-104763
Fix corrupted negative values for signed BC6
This commit is contained in:
@@ -89,12 +89,36 @@ float CalcMSLE(float3 a, float3 b) {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adapt the log function to make sense when a < 0
|
||||||
|
float3 customLog2(float3 a) {
|
||||||
|
return float3(
|
||||||
|
a.x >= 0 ? log2(a.x + 1.0f) : -log2(-a.x + 1.0f),
|
||||||
|
a.y >= 0 ? log2(a.y + 1.0f) : -log2(-a.y + 1.0f),
|
||||||
|
a.z >= 0 ? log2(a.z + 1.0f) : -log2(-a.z + 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inverse of customLog2()
|
||||||
|
float3 customExp2(float3 a) {
|
||||||
|
return float3(
|
||||||
|
a.x >= 0 ? exp2(a.x) - 1.0f : -(exp2(-a.x) - 1.0f),
|
||||||
|
a.y >= 0 ? exp2(a.y) - 1.0f : -(exp2(-a.y) - 1.0f),
|
||||||
|
a.z >= 0 ? exp2(a.z) - 1.0f : -(exp2(-a.z) - 1.0f));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
float CalcMSLE(float3 a, float3 b) {
|
float CalcMSLE(float3 a, float3 b) {
|
||||||
float3 err = log2((b + 1.0f) / (a + 1.0f));
|
float3 err = log2((b + 1.0f) / (a + 1.0f));
|
||||||
err = err * err;
|
err = err * err;
|
||||||
return err.x + err.y + err.z;
|
return err.x + err.y + err.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float3 customLog2(float3 a) {
|
||||||
|
return log2(a + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 customExp2(float3 a) {
|
||||||
|
return exp2(a) - 1.0f;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint PatternFixupID(uint i) {
|
uint PatternFixupID(uint i) {
|
||||||
@@ -272,15 +296,15 @@ void EncodeP1(inout uint4 block, inout float blockMSLE, float3 texels[16]) {
|
|||||||
refinedBlockMax = max(refinedBlockMax, texels[i] == blockMax ? refinedBlockMax : texels[i]);
|
refinedBlockMax = max(refinedBlockMax, texels[i] == blockMax ? refinedBlockMax : texels[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 logBlockMax = log2(blockMax + 1.0f);
|
float3 logBlockMax = customLog2(blockMax);
|
||||||
float3 logBlockMin = log2(blockMin + 1.0f);
|
float3 logBlockMin = customLog2(blockMin);
|
||||||
float3 logRefinedBlockMax = log2(refinedBlockMax + 1.0f);
|
float3 logRefinedBlockMax = customLog2(refinedBlockMax);
|
||||||
float3 logRefinedBlockMin = log2(refinedBlockMin + 1.0f);
|
float3 logRefinedBlockMin = customLog2(refinedBlockMin);
|
||||||
float3 logBlockMaxExt = (logBlockMax - logBlockMin) * (1.0f / 32.0f);
|
float3 logBlockMaxExt = (logBlockMax - logBlockMin) * (1.0f / 32.0f);
|
||||||
logBlockMin += min(logRefinedBlockMin - logBlockMin, logBlockMaxExt);
|
logBlockMin += min(logRefinedBlockMin - logBlockMin, logBlockMaxExt);
|
||||||
logBlockMax -= min(logBlockMax - logRefinedBlockMax, logBlockMaxExt);
|
logBlockMax -= min(logBlockMax - logRefinedBlockMax, logBlockMaxExt);
|
||||||
blockMin = exp2(logBlockMin) - 1.0f;
|
blockMin = customExp2(logBlockMin);
|
||||||
blockMax = exp2(logBlockMax) - 1.0f;
|
blockMax = customExp2(logBlockMax);
|
||||||
|
|
||||||
float3 blockDir = blockMax - blockMin;
|
float3 blockDir = blockMax - blockMin;
|
||||||
blockDir = blockDir / (blockDir.x + blockDir.y + blockDir.z);
|
blockDir = blockDir / (blockDir.x + blockDir.y + blockDir.z);
|
||||||
|
|||||||
Reference in New Issue
Block a user