Moves hardcoded blend state in ParticleRenderer to the transparent particles technique.

This was SVN commit r26217.
This commit is contained in:
vladislavbelov 2022-01-14 18:18:28 +00:00
parent 829e37371b
commit fc223e3540
2 changed files with 27 additions and 27 deletions

View file

@ -1,14 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<effect>
<technique>
<require shaders="arb"/>
<pass shader="arb/particle"/>
</technique>
<technique>
<require shaders="arb"/>
<pass shader="arb/particle">
<blend src="src_alpha" dst="one_minus_src_alpha"/>
</pass>
</technique>
<technique>
<require shaders="glsl"/>
<pass shader="glsl/particle"/>
</technique>
<technique>
<require shaders="glsl"/>
<pass shader="glsl/particle">
<blend src="src_alpha" dst="one_minus_src_alpha"/>
</pass>
</technique>
</effect>

View file

@ -32,8 +32,8 @@
struct ParticleRendererInternals
{
int frameNumber;
CShaderTechniquePtr shader;
CShaderTechniquePtr shaderSolid;
CShaderTechniquePtr tech;
CShaderTechniquePtr techSolid;
std::vector<CParticleEmitter*> emitters[CSceneRenderer::CULL_MAX];
};
@ -87,10 +87,10 @@ void ParticleRenderer::PrepareForRendering(const CShaderDefines& context)
// Can't load the shader in the constructor because it's called before the
// renderer initialisation is complete, so load it the first time through here
if (!m->shader)
if (!m->tech)
{
m->shader = g_Renderer.GetShaderManager().LoadEffect(str_particle, context);
m->shaderSolid = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, context);
m->tech = g_Renderer.GetShaderManager().LoadEffect(str_particle, context);
m->techSolid = g_Renderer.GetShaderManager().LoadEffect(str_particle_solid, context);
}
++m->frameNumber;
@ -120,36 +120,32 @@ void ParticleRenderer::PrepareForRendering(const CShaderDefines& context)
void ParticleRenderer::RenderParticles(int cullGroup, bool solidColor)
{
CShaderTechniquePtr shader = solidColor ? m->shaderSolid : m->shader;
const CShaderTechniquePtr& tech = solidColor ? m->techSolid : m->tech;
std::vector<CParticleEmitter*>& emitters = m->emitters[cullGroup];
shader->BeginPass();
tech->BeginPass();
shader->GetShader()->Uniform(str_transform, g_Renderer.GetSceneRenderer().GetViewCamera().GetViewProjection());
shader->GetShader()->Uniform(str_modelViewMatrix, g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse());
const CShaderProgramPtr& shader = tech->GetShader();
shader->Uniform(str_transform, g_Renderer.GetSceneRenderer().GetViewCamera().GetViewProjection());
shader->Uniform(str_modelViewMatrix, g_Renderer.GetSceneRenderer().GetViewCamera().GetOrientation().GetInverse());
if (!solidColor)
glEnable(GL_BLEND);
glDepthMask(0);
for (size_t i = 0; i < emitters.size(); ++i)
for (CParticleEmitter* emitter : m->emitters[cullGroup])
{
CParticleEmitter* emitter = emitters[i];
emitter->Bind(shader->GetShader());
emitter->RenderArray(shader->GetShader());
emitter->Bind(shader);
emitter->RenderArray(shader);
}
CVertexBuffer::Unbind();
glBlendEquationEXT(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_BLEND);
glDepthMask(1);
shader->EndPass();
tech->EndPass();
}
void ParticleRenderer::RenderBounds(int cullGroup)