- reworked fog uniforms to move the global fog mode setting to the viewpoint buffer.

This commit is contained in:
Christoph Oelckers 2018-09-06 19:14:30 +02:00
parent 7cbc98e1d0
commit 8b26b6dd1e
9 changed files with 19 additions and 32 deletions

View file

@ -144,6 +144,7 @@ void GLViewpointBuffer::Set2D(int width, int height)
HWViewpointUniforms matrices; HWViewpointUniforms matrices;
matrices.SetDefaults(); matrices.SetDefaults();
matrices.mProjectionMatrix.ortho(0, width, height, 0, -1.0f, 1.0f); matrices.mProjectionMatrix.ortho(0, width, height, 0, -1.0f, 1.0f);
matrices.mFogEnabled = 3;
matrices.CalcDependencies(); matrices.CalcDependencies();
Map(); Map();
memcpy(mBufferPointer, &matrices, sizeof(matrices)); memcpy(mBufferPointer, &matrices, sizeof(matrices));

View file

@ -119,7 +119,7 @@ bool FRenderState::ApplyShader()
static uint64_t firstFrame = 0; static uint64_t firstFrame = 0;
// if firstFrame is not yet initialized, initialize it to current time // if firstFrame is not yet initialized, initialize it to current time
// if we're going to overflow a float (after ~4.6 hours, or 24 bits), re-init to regain precision // if we're going to overflow a float (after ~4.6 hours, or 24 bits), re-init to regain precision
if ((firstFrame == 0) || (screen->FrameTime - firstFrame >= 1<<24) || level.ShaderStartTime >= firstFrame) if ((firstFrame == 0) || (screen->FrameTime - firstFrame >= 1 << 24) || level.ShaderStartTime >= firstFrame)
firstFrame = screen->FrameTime; firstFrame = screen->FrameTime;
static const float nulvec[] = { 0.f, 0.f, 0.f, 0.f }; static const float nulvec[] = { 0.f, 0.f, 0.f, 0.f };
@ -133,31 +133,15 @@ bool FRenderState::ApplyShader()
activeShader->Bind(); activeShader->Bind();
} }
int fogset = 0;
if (mFogEnabled)
{
if (mFogEnabled == 2)
{
fogset = -3; // 2D rendering with 'foggy' overlay.
}
else if ((mFogColor & 0xffffff) == 0)
{
fogset = gl_fogmode;
}
else
{
fogset = -gl_fogmode;
}
}
glVertexAttrib4fv(VATTR_COLOR, mColor.vec); glVertexAttrib4fv(VATTR_COLOR, mColor.vec);
glVertexAttrib4fv(VATTR_NORMAL, mNormal.vec); glVertexAttrib4fv(VATTR_NORMAL, mNormal.vec);
activeShader->muDesaturation.Set(mDesaturation / 255.f); activeShader->muDesaturation.Set(mDesaturation / 255.f);
activeShader->muFogEnabled.Set(fogset);
activeShader->muTextureMode.Set(mTextureMode == TM_MODULATE && mTempTM == TM_OPAQUE ? TM_OPAQUE : mTextureMode); activeShader->muTextureMode.Set(mTextureMode == TM_MODULATE && mTempTM == TM_OPAQUE ? TM_OPAQUE : mTextureMode);
float fds = mLightParms[2];
if (!mFogEnabled) mLightParms[2] = 0;
activeShader->muLightParms.Set(mLightParms); activeShader->muLightParms.Set(mLightParms);
mLightParms[2] = fds;
activeShader->muFogColor.Set(mFogColor); activeShader->muFogColor.Set(mFogColor);
activeShader->muObjectColor.Set(mObjectColor); activeShader->muObjectColor.Set(mObjectColor);
activeShader->muObjectColor2.Set(mObjectColor2); activeShader->muObjectColor2.Set(mObjectColor2);

View file

@ -375,6 +375,7 @@ void FDrawInfo::DrawEndScene2D(sector_t * viewsector)
HWViewpointUniforms vp = VPUniforms; HWViewpointUniforms vp = VPUniforms;
vp.mViewMatrix.loadIdentity(); vp.mViewMatrix.loadIdentity();
vp.mProjectionMatrix = vrmode->GetHUDSpriteProjection(); vp.mProjectionMatrix = vrmode->GetHUDSpriteProjection();
vp.mFogEnabled = 0;
GLRenderer->mViewpoints->SetViewpoint(&vp); GLRenderer->mViewpoints->SetViewpoint(&vp);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDisable(GL_MULTISAMPLE); glDisable(GL_MULTISAMPLE);

View file

@ -68,6 +68,8 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
int uViewHeight; // Software fuzz scaling int uViewHeight; // Software fuzz scaling
float uClipHeight; float uClipHeight;
float uClipHeightDirection; float uClipHeightDirection;
int uFogEnabled;
}; };
)"; )";
@ -98,7 +100,6 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
i_data += "#define uFogDensity uLightAttr.b\n"; i_data += "#define uFogDensity uLightAttr.b\n";
i_data += "#define uLightFactor uLightAttr.g\n"; i_data += "#define uLightFactor uLightAttr.g\n";
i_data += "#define uLightDist uLightAttr.r\n"; i_data += "#define uLightDist uLightAttr.r\n";
i_data += "uniform int uFogEnabled;\n";
// dynamic lights // dynamic lights
i_data += "uniform int uLightIndex;\n"; i_data += "uniform int uLightIndex;\n";
@ -330,7 +331,6 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
muDesaturation.Init(hShader, "uDesaturationFactor"); muDesaturation.Init(hShader, "uDesaturationFactor");
muFogEnabled.Init(hShader, "uFogEnabled");
muTextureMode.Init(hShader, "uTextureMode"); muTextureMode.Init(hShader, "uTextureMode");
muLightParms.Init(hShader, "uLightAttr"); muLightParms.Init(hShader, "uLightAttr");
muClipSplit.Init(hShader, "uClipSplit"); muClipSplit.Init(hShader, "uClipSplit");

View file

@ -242,7 +242,6 @@ class FShader
FName mName; FName mName;
FBufferedUniform1f muDesaturation; FBufferedUniform1f muDesaturation;
FBufferedUniform1i muFogEnabled;
FBufferedUniform1i muTextureMode; FBufferedUniform1i muTextureMode;
FBufferedUniform4f muLightParms; FBufferedUniform4f muLightParms;
FBufferedUniform2f muClipSplit; FBufferedUniform2f muClipSplit;

View file

@ -280,5 +280,6 @@ void HWViewpointUniforms::SetDefaults()
mGlobVis = (float)R_GetGlobVis(r_viewwindow, r_visibility) / 32.f; mGlobVis = (float)R_GetGlobVis(r_viewwindow, r_visibility) / 32.f;
mPalLightLevels = static_cast<int>(gl_bandedswlight) | (static_cast<int>(gl_fogmode) << 8); mPalLightLevels = static_cast<int>(gl_bandedswlight) | (static_cast<int>(gl_fogmode) << 8);
mClipLine.X = -10000000.0f; mClipLine.X = -10000000.0f;
mFogEnabled = gl_fogmode;
} }

View file

@ -16,6 +16,7 @@ struct HWViewpointUniforms
int mViewHeight = 0; int mViewHeight = 0;
float mClipHeight = 0.f; float mClipHeight = 0.f;
float mClipHeightDirection = 0.f; float mClipHeightDirection = 0.f;
int mFogEnabled = 0;
void CalcDependencies() void CalcDependencies()
{ {

View file

@ -15,7 +15,7 @@ void main()
// //
// calculate fog factor // calculate fog factor
// //
if (uFogEnabled == -1) if (uFogEnabled == 1)
{ {
fogdist = pixelpos.w; fogdist = pixelpos.w;
} }

View file

@ -358,7 +358,7 @@ vec4 getLightColor(Material material, float fogdist, float fogfactor)
float newlightlevel = 1.0 - R_DoomLightingEquation(uLightLevel); float newlightlevel = 1.0 - R_DoomLightingEquation(uLightLevel);
color.rgb *= newlightlevel; color.rgb *= newlightlevel;
} }
else if (uFogEnabled > 0) else if (uFogColor.rgb == vec3(0.0))
{ {
// brightening around the player for light mode 2 // brightening around the player for light mode 2
if (fogdist < uLightDist) if (fogdist < uLightDist)
@ -421,7 +421,7 @@ vec3 AmbientOcclusionColor()
// //
// calculate fog factor // calculate fog factor
// //
if (uFogEnabled == -1) if (uFogEnabled == 1)
{ {
fogdist = pixelpos.w; fogdist = pixelpos.w;
} }
@ -449,17 +449,17 @@ void main()
if (frag.a <= uAlphaThreshold) discard; if (frag.a <= uAlphaThreshold) discard;
#endif #endif
if (uFogEnabled != -3) // check for special 2D 'fog' mode. if (uFogEnabled != 3) // check for special 2D 'fog' mode.
{ {
float fogdist = 0.0; float fogdist = 0.0;
float fogfactor = 0.0; float fogfactor = 1.0;
// //
// calculate fog factor // calculate fog factor
// //
if (uFogEnabled != 0) if (uFogEnabled != 0 && uFogDensity != 0)
{ {
if (uFogEnabled == 1 || uFogEnabled == -1) if (uFogEnabled == 1)
{ {
fogdist = pixelpos.w; fogdist = pixelpos.w;
} }
@ -476,7 +476,7 @@ void main()
// //
// colored fog // colored fog
// //
if (uFogEnabled < 0) if (uFogColor.rgb != vec3(0.0))
{ {
frag = applyFog(frag, fogfactor); frag = applyFog(frag, fogfactor);
} }
@ -494,7 +494,7 @@ void main()
vec4 cm = (uObjectColor + gray * (uObjectColor2 - uObjectColor)) * 2; vec4 cm = (uObjectColor + gray * (uObjectColor2 - uObjectColor)) * 2;
frag = vec4(clamp(cm.rgb, 0.0, 1.0), frag.a); frag = vec4(clamp(cm.rgb, 0.0, 1.0), frag.a);
} }
frag = frag * ProcessLight(material, vColor); frag = frag * ProcessLight(material, vColor);
frag.rgb = frag.rgb + uFogColor.rgb; frag.rgb = frag.rgb + uFogColor.rgb;
} }
FragColor = frag; FragColor = frag;