Don't use scalar dot().

This commit is contained in:
Hans-Kristian Arntzen 2019-07-03 14:32:06 +02:00
parent 041f103d44
commit 4056d0b74e
6 changed files with 27 additions and 15 deletions

View File

@ -18,14 +18,16 @@ float SPIRV_Cross_Reflect(float i, float n)
float SPIRV_Cross_Refract(float i, float n, float eta)
{
float k = 1.0 - eta * eta * (1.0 - dot(n, i) * dot(n, i));
float NoI = n * i;
float NoI2 = NoI * NoI;
float k = 1.0 - eta * eta * (1.0 - NoI2);
if (k < 0.0)
{
return 0.0;
}
else
{
return eta * i - (eta * dot(n, i) + sqrt(k)) * n;
return eta * i - (eta * NoI + sqrt(k)) * n;
}
}

View File

@ -18,20 +18,22 @@ struct main0_in
template<typename T>
inline T spvReflect(T i, T n)
{
return i - T(2) * dot(n, i) * n;
return i - T(2) * i * n * n;
}
template<typename T>
inline T spvRefract(T i, T n, T eta)
{
T k = T(1) - eta * eta * (T(1) - dot(n, i) * dot(n, i));
T NoI = n * i;
T NoI2 = NoI * NoI;
T k = T(1) - eta * eta * (T(1) - NoI2);
if (k < T(0))
{
return T(0);
}
else
{
return eta * i - (eta * dot(n, i) + sqrt(k)) * n;
return eta * i - (eta * NoI + sqrt(k)) * n;
}
}

View File

@ -18,14 +18,16 @@ float SPIRV_Cross_Reflect(float i, float n)
float SPIRV_Cross_Refract(float i, float n, float eta)
{
float k = 1.0 - eta * eta * (1.0 - dot(n, i) * dot(n, i));
float NoI = n * i;
float NoI2 = NoI * NoI;
float k = 1.0 - eta * eta * (1.0 - NoI2);
if (k < 0.0)
{
return 0.0;
}
else
{
return eta * i - (eta * dot(n, i) + sqrt(k)) * n;
return eta * i - (eta * NoI + sqrt(k)) * n;
}
}

View File

@ -18,20 +18,22 @@ struct main0_in
template<typename T>
inline T spvReflect(T i, T n)
{
return i - T(2) * dot(n, i) * n;
return i - T(2) * i * n * n;
}
template<typename T>
inline T spvRefract(T i, T n, T eta)
{
T k = T(1) - eta * eta * (T(1) - dot(n, i) * dot(n, i));
T NoI = n * i;
T NoI2 = NoI * NoI;
T k = T(1) - eta * eta * (T(1) - NoI2);
if (k < T(0))
{
return T(0);
}
else
{
return eta * i - (eta * dot(n, i) + sqrt(k)) * n;
return eta * i - (eta * NoI + sqrt(k)) * n;
}
}

View File

@ -1758,14 +1758,16 @@ void CompilerHLSL::emit_resources()
// FP16/FP64? No templates in HLSL.
statement("float SPIRV_Cross_Refract(float i, float n, float eta)");
begin_scope();
statement("float k = 1.0 - eta * eta * (1.0 - dot(n, i) * dot(n, i));");
statement("float NoI = n * i;");
statement("float NoI2 = NoI * NoI;");
statement("float k = 1.0 - eta * eta * (1.0 - NoI2);");
statement("if (k < 0.0)");
begin_scope();
statement("return 0.0;");
end_scope();
statement("else");
begin_scope();
statement("return eta * i - (eta * dot(n, i) + sqrt(k)) * n;");
statement("return eta * i - (eta * NoI + sqrt(k)) * n;");
end_scope();
end_scope();
statement("");

View File

@ -3194,7 +3194,7 @@ void CompilerMSL::emit_custom_functions()
statement("template<typename T>");
statement("inline T spvReflect(T i, T n)");
begin_scope();
statement("return i - T(2) * dot(n, i) * n;");
statement("return i - T(2) * i * n * n;");
end_scope();
statement("");
break;
@ -3204,14 +3204,16 @@ void CompilerMSL::emit_custom_functions()
statement("template<typename T>");
statement("inline T spvRefract(T i, T n, T eta)");
begin_scope();
statement("T k = T(1) - eta * eta * (T(1) - dot(n, i) * dot(n, i));");
statement("T NoI = n * i;");
statement("T NoI2 = NoI * NoI;");
statement("T k = T(1) - eta * eta * (T(1) - NoI2);");
statement("if (k < T(0))");
begin_scope();
statement("return T(0);");
end_scope();
statement("else");
begin_scope();
statement("return eta * i - (eta * dot(n, i) + sqrt(k)) * n;");
statement("return eta * i - (eta * NoI + sqrt(k)) * n;");
end_scope();
end_scope();
statement("");