Commit a36f3f9a by Nicolas Capens

Implement exponential vertex fog.

Change-Id: I731bb641e00ba9ac880fdb9f721af24906b4850f Reviewed-on: https://swiftshader-review.googlesource.com/3802Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent de8c7a52
......@@ -781,7 +781,7 @@ namespace sw
void PixelProcessor::setFogDensity(float fogDensity)
{
fog.densityE = replicate(-fogDensity * 1.442695f); // 1/e^x = 2^(-x*1.44)
fog.densityE2 = replicate(fogDensity * 1.201122f); // 1/e^(x^2) = 2^(-(x*1.20)^2)
fog.density2E = replicate(-fogDensity * fogDensity * 1.442695f);
}
void PixelProcessor::setPixelFogMode(FogMode fogMode)
......
......@@ -165,7 +165,7 @@ namespace sw
word4 color4[3];
float4 colorF[3];
float4 densityE;
float4 densityE2;
float4 density2E;
};
struct Factor
......
......@@ -666,10 +666,9 @@ namespace sw
zw = exponential2(zw, true);
break;
case FOG_EXP2:
zw *= *Pointer<Float4>(r.data + OFFSET(DrawData,fog.densityE2));
zw *= zw;
zw *= *Pointer<Float4>(r.data + OFFSET(DrawData,fog.density2E));
zw = exponential2(zw, true);
zw = Rcp_pp(zw);
break;
default:
ASSERT(false);
......
......@@ -172,6 +172,8 @@ namespace sw
r.o[Pos].z = position.z;
r.o[Pos].w = position.w;
Vector4f vertexPosition = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
if(state.vertexNormalActive)
{
normal = transformBlend(r, r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false);
......@@ -239,8 +241,6 @@ namespace sw
diffuseSum.z = Float4(0.0f);
diffuseSum.w = Float4(0.0f);
Vector4f vertexPosition = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
for(int i = 0; i < 8; i++)
{
if(!(state.vertexLightActive & (1 << i)))
......@@ -488,6 +488,17 @@ namespace sw
if(state.fogActive)
{
Float4 f;
if(!state.rangeFogActive)
{
f = Abs(vertexPosition.z);
}
else
{
f = Sqrt(dot3(vertexPosition, vertexPosition)); // FIXME: f = length(vertexPosition);
}
switch(state.vertexFogMode)
{
case FOG_NONE:
......@@ -501,25 +512,13 @@ namespace sw
}
break;
case FOG_LINEAR:
r.o[Fog].x = f * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(r.data + OFFSET(DrawData,fog.offset));
break;
case FOG_EXP:
r.o[Fog].x = exponential2(f * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.densityE)), true);
break;
case FOG_EXP2:
if(!state.rangeFogActive)
{
r.o[Fog].x = r.o[Pos].z;
}
else
{
Vector4f pos;
pos.x = r.o[Pos].x;
pos.y = r.o[Pos].y;
pos.z = r.o[Pos].z;
pos.w = r.o[Pos].w;
r.o[Fog].x = Sqrt(dot3(pos, pos)); // FIXME: oFog = length(o[Pos]);
}
r.o[Fog].x = r.o[Fog].x * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(r.data + OFFSET(DrawData,fog.offset));
r.o[Fog].x = exponential2((f * f) * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.density2E)), true);
break;
default:
ASSERT(false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment