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 ...@@ -781,7 +781,7 @@ namespace sw
void PixelProcessor::setFogDensity(float fogDensity) void PixelProcessor::setFogDensity(float fogDensity)
{ {
fog.densityE = replicate(-fogDensity * 1.442695f); // 1/e^x = 2^(-x*1.44) 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) void PixelProcessor::setPixelFogMode(FogMode fogMode)
......
...@@ -165,7 +165,7 @@ namespace sw ...@@ -165,7 +165,7 @@ namespace sw
word4 color4[3]; word4 color4[3];
float4 colorF[3]; float4 colorF[3];
float4 densityE; float4 densityE;
float4 densityE2; float4 density2E;
}; };
struct Factor struct Factor
......
...@@ -666,10 +666,9 @@ namespace sw ...@@ -666,10 +666,9 @@ namespace sw
zw = exponential2(zw, true); zw = exponential2(zw, true);
break; break;
case FOG_EXP2: case FOG_EXP2:
zw *= *Pointer<Float4>(r.data + OFFSET(DrawData,fog.densityE2));
zw *= zw; zw *= zw;
zw *= *Pointer<Float4>(r.data + OFFSET(DrawData,fog.density2E));
zw = exponential2(zw, true); zw = exponential2(zw, true);
zw = Rcp_pp(zw);
break; break;
default: default:
ASSERT(false); ASSERT(false);
......
...@@ -172,6 +172,8 @@ namespace sw ...@@ -172,6 +172,8 @@ namespace sw
r.o[Pos].z = position.z; r.o[Pos].z = position.z;
r.o[Pos].w = position.w; 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) if(state.vertexNormalActive)
{ {
normal = transformBlend(r, r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false); normal = transformBlend(r, r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false);
...@@ -239,8 +241,6 @@ namespace sw ...@@ -239,8 +241,6 @@ namespace sw
diffuseSum.z = Float4(0.0f); diffuseSum.z = Float4(0.0f);
diffuseSum.w = 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++) for(int i = 0; i < 8; i++)
{ {
if(!(state.vertexLightActive & (1 << i))) if(!(state.vertexLightActive & (1 << i)))
...@@ -488,6 +488,17 @@ namespace sw ...@@ -488,6 +488,17 @@ namespace sw
if(state.fogActive) 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) switch(state.vertexFogMode)
{ {
case FOG_NONE: case FOG_NONE:
...@@ -501,25 +512,13 @@ namespace sw ...@@ -501,25 +512,13 @@ namespace sw
} }
break; break;
case FOG_LINEAR: 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: case FOG_EXP:
r.o[Fog].x = exponential2(f * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.densityE)), true);
break;
case FOG_EXP2: case FOG_EXP2:
if(!state.rangeFogActive) r.o[Fog].x = exponential2((f * f) * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.density2E)), true);
{
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));
break; break;
default: default:
ASSERT(false); 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