mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-23 11:51:26 +00:00
Optimise dyn lights a bit
This commit is contained in:
parent
40135c4c86
commit
0a28d50b12
4 changed files with 45 additions and 50 deletions
|
@ -108,6 +108,8 @@ bool FGLRenderState::ApplyShader()
|
||||||
fogset = -gl_fogmode;
|
fogset = -gl_fogmode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (mSpecialEffect > EFF_NONE)
|
if (mSpecialEffect > EFF_NONE)
|
||||||
{
|
{
|
||||||
|
@ -150,7 +152,10 @@ bool FGLRenderState::ApplyShader()
|
||||||
bool doDesaturate = false;
|
bool doDesaturate = false;
|
||||||
doDesaturate = mStreamData.uDesaturationFactor != 0;
|
doDesaturate = mStreamData.uDesaturationFactor != 0;
|
||||||
|
|
||||||
activeShader->Bind(textureMode, texFlags, blendFlags, twoDFog, fogEnabled, fogEquationRadial, colouredFog, doDesaturate);
|
bool dynLights = false;
|
||||||
|
dynLights = (mLightIndex >= 0);
|
||||||
|
|
||||||
|
activeShader->Bind(textureMode, texFlags, blendFlags, twoDFog, fogEnabled, fogEquationRadial, colouredFog, doDesaturate, dynLights);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -255,25 +260,14 @@ bool FGLRenderState::ApplyShader()
|
||||||
matrixToGL(identityMatrix, activeShader->cur->normalmodelmatrix_index);
|
matrixToGL(identityMatrix, activeShader->cur->normalmodelmatrix_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
int index = mLightIndex;
|
if (mLightIndex >= 0)
|
||||||
// Mess alert for crappy AncientGL!
|
|
||||||
if (!screen->mLights->GetBufferType() && index >= 0)
|
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
size_t start, size;
|
|
||||||
index = screen->mLights->GetBinding(index, &start, &size);
|
|
||||||
|
|
||||||
if (start != mLastMappedLightIndex)
|
|
||||||
{
|
|
||||||
mLastMappedLightIndex = start;
|
|
||||||
static_cast<GLDataBuffer*>(screen->mLights->GetBuffer())->BindRange(nullptr, start, size);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
float* ptr = ((float*)screen->mLights->GetBuffer()->Memory());
|
float* ptr = ((float*)screen->mLights->GetBuffer()->Memory());
|
||||||
ptr += ((int64_t)index * 4);
|
ptr += ((int64_t)mLightIndex * 4);
|
||||||
float array[64];
|
float array[64];
|
||||||
memcpy(array, ptr, 4 * 64);
|
memcpy(array, ptr, 4 * 64);
|
||||||
|
|
||||||
glUniform4fv(activeShader->cur->lights_index, 64, ptr);
|
glUniform4fv(activeShader->cur->lights_index, 64, ptr);
|
||||||
|
|
||||||
activeShader->cur->muLightIndex.Set(0);
|
activeShader->cur->muLightIndex.Set(0);
|
||||||
|
|
|
@ -646,9 +646,9 @@ FShader::~FShader()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FShader::Bind(int textureMode, int texFlags, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog,bool doDesaturate)
|
bool FShader::Bind(int textureMode, int texFlags, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog, bool doDesaturate, bool dynLights)
|
||||||
{
|
{
|
||||||
uint32_t tag = CreateShaderTag(textureMode, texFlags, blendFlags, twoDFog, fogEnabled, fogEquationRadial, colouredFog, doDesaturate);
|
uint32_t tag = CreateShaderTag(textureMode, texFlags, blendFlags, twoDFog, fogEnabled, fogEquationRadial, colouredFog, doDesaturate, dynLights);
|
||||||
|
|
||||||
|
|
||||||
cur = variants[tag];
|
cur = variants[tag];
|
||||||
|
@ -665,6 +665,7 @@ bool FShader::Bind(int textureMode, int texFlags, int blendFlags, bool twoDFog,
|
||||||
variantConfig.AppendFormat("#define DEF_FOG_COLOURED %d\n", colouredFog);
|
variantConfig.AppendFormat("#define DEF_FOG_COLOURED %d\n", colouredFog);
|
||||||
|
|
||||||
variantConfig.AppendFormat("#define DEF_DO_DESATURATE %d\n", doDesaturate);
|
variantConfig.AppendFormat("#define DEF_DO_DESATURATE %d\n", doDesaturate);
|
||||||
|
variantConfig.AppendFormat("#define DEF_DYNAMIC_LIGHTS %d\n", dynLights);
|
||||||
|
|
||||||
Printf("Shader: %s", variantConfig.GetChars());
|
Printf("Shader: %s", variantConfig.GetChars());
|
||||||
|
|
||||||
|
@ -878,7 +879,7 @@ FShader *FShaderCollection::BindEffect(int effect)
|
||||||
{
|
{
|
||||||
if (effect >= 0 && effect < MAX_EFFECTS && mEffectShaders[effect] != NULL)
|
if (effect >= 0 && effect < MAX_EFFECTS && mEffectShaders[effect] != NULL)
|
||||||
{
|
{
|
||||||
mEffectShaders[effect]->Bind(0,0,0,0,0,0,0,0);
|
mEffectShaders[effect]->Bind(0,0,0,0,0,0,0,0,0);
|
||||||
return mEffectShaders[effect];
|
return mEffectShaders[effect];
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -353,7 +353,7 @@ public:
|
||||||
|
|
||||||
void LoadVariant();
|
void LoadVariant();
|
||||||
|
|
||||||
uint32_t CreateShaderTag(int textureMode, int texf, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog, bool doDesaturate)
|
uint32_t CreateShaderTag(int textureMode, int texf, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog, bool doDesaturate, bool dynLights)
|
||||||
{
|
{
|
||||||
uint32_t tag = 0;
|
uint32_t tag = 0;
|
||||||
tag |= (textureMode & 0x7);
|
tag |= (textureMode & 0x7);
|
||||||
|
@ -368,12 +368,13 @@ public:
|
||||||
tag |= (colouredFog & 1) << 10;
|
tag |= (colouredFog & 1) << 10;
|
||||||
|
|
||||||
tag |= (doDesaturate & 1) << 11;
|
tag |= (doDesaturate & 1) << 11;
|
||||||
|
|
||||||
|
tag |= (dynLights & 1) << 12;
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Bind(int textureMode, int texFlags, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog, bool doDesaturate);
|
bool Bind(int textureMode, int texFlags, int blendFlags, bool twoDFog, bool fogEnabled, bool fogEquationRadial, bool colouredFog, bool doDesaturate, bool dynLights);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,43 +42,42 @@ vec3 ProcessMaterialLight(Material material, vec3 color)
|
||||||
vec4 dynlight = uDynLightColor;
|
vec4 dynlight = uDynLightColor;
|
||||||
vec3 normal = material.Normal;
|
vec3 normal = material.Normal;
|
||||||
|
|
||||||
if (uLightIndex >= 0)
|
#if (DEF_DYNAMIC_LIGHTS == 1)
|
||||||
{
|
|
||||||
ivec4 lightRange = ivec4(lights[uLightIndex]) + ivec4(uLightIndex + 1);
|
ivec4 lightRange = ivec4(lights[uLightIndex]) + ivec4(uLightIndex + 1);
|
||||||
if (lightRange.z > lightRange.x)
|
|
||||||
{
|
|
||||||
// modulated lights
|
|
||||||
for(int i=lightRange.x; i<lightRange.y; i+=4)
|
|
||||||
{
|
|
||||||
dynlight.rgb += lightContribution(i, normal);
|
|
||||||
}
|
|
||||||
|
|
||||||
// subtractive lights
|
//if (lightRange.z > lightRange.x)
|
||||||
for(int i=lightRange.y; i<lightRange.z; i+=4)
|
{
|
||||||
{
|
// modulated lights
|
||||||
dynlight.rgb -= lightContribution(i, normal);
|
for(int i=lightRange.x; i<lightRange.y; i+=4)
|
||||||
}
|
{
|
||||||
|
dynlight.rgb += lightContribution(i, normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// subtractive lights
|
||||||
|
for(int i=lightRange.y; i<lightRange.z; i+=4)
|
||||||
|
{
|
||||||
|
dynlight.rgb -= lightContribution(i, normal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 frag = material.Base.rgb * clamp(color + desaturate(dynlight).rgb, 0.0, 1.4);
|
vec3 frag = material.Base.rgb * clamp(color + desaturate(dynlight).rgb, 0.0, 1.4);
|
||||||
|
|
||||||
if (uLightIndex >= 0)
|
//if (lightRange.w > lightRange.z)
|
||||||
{
|
{
|
||||||
ivec4 lightRange = ivec4(lights[uLightIndex]) + ivec4(uLightIndex + 1);
|
vec4 addlight = vec4(0.0,0.0,0.0,0.0);
|
||||||
if (lightRange.w > lightRange.z)
|
|
||||||
{
|
|
||||||
vec4 addlight = vec4(0.0,0.0,0.0,0.0);
|
|
||||||
|
|
||||||
// additive lights
|
// additive lights
|
||||||
for(int i=lightRange.z; i<lightRange.w; i+=4)
|
for(int i=lightRange.z; i<lightRange.w; i+=4)
|
||||||
{
|
{
|
||||||
addlight.rgb += lightContribution(i, normal);
|
addlight.rgb += lightContribution(i, normal);
|
||||||
}
|
|
||||||
|
|
||||||
frag = clamp(frag + desaturate(addlight).rgb, 0.0, 1.0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frag = clamp(frag + desaturate(addlight).rgb, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return frag;
|
return frag;
|
||||||
|
#else
|
||||||
|
return material.Base.rgb * clamp(color, 0.0, 1.4);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue