Fix blending modes issue (#281)

Only for rooms and some objects but not for Lara or most effects
This commit is contained in:
Lwmte 2021-08-01 15:54:54 +03:00
parent f53c825007
commit ed9fc47d27
5 changed files with 60 additions and 53 deletions

View file

@ -43,8 +43,13 @@ enum BLEND_MODES
BLENDMODE_OPAQUE = 0, BLENDMODE_OPAQUE = 0,
BLENDMODE_ALPHATEST = 1, BLENDMODE_ALPHATEST = 1,
BLENDMODE_ADDITIVE = 2, BLENDMODE_ADDITIVE = 2,
BLENDMODE_SUBTRACTIVE = 3, BLENDMODE_NOZTEST = 4,
BLENDMODE_ALPHABLEND = 4, BLENDMODE_SUBTRACTIVE = 5,
BLENDMODE_WIREFRAME = 6,
BLENDMODE_EXCLUDE = 8,
BLENDMODE_SCREEN = 9,
BLENDMODE_LIGHTEN = 10,
BLENDMODE_ALPHABLEND = 11,
NUM_BLENDMODES NUM_BLENDMODES
}; };

View file

@ -546,7 +546,8 @@ namespace T5M::Renderer
void drawExplosionParticles(RenderView& view); void drawExplosionParticles(RenderView& view);
void renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumber); void renderToCubemap(const RenderTargetCube& dest,const Vector3& pos,int roomNumber);
void drawLaraHolsters(bool transparent); void drawLaraHolsters(bool transparent);
void drawSimpleParticles(RenderView& view); void drawSimpleParticles(RenderView& view);
void setBlendMode(BLEND_MODES blendMode);
public: public:
DirectX::SimpleMath::Matrix View; DirectX::SimpleMath::Matrix View;
DirectX::SimpleMath::Matrix Projection; DirectX::SimpleMath::Matrix Projection;

View file

@ -148,12 +148,9 @@ namespace T5M::Renderer
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (bucket.blendMode == 0) setBlendMode(bucket.blendMode);
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
else
m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF);
m_stMisc.AlphaTest = (bucket.blendMode == 0); m_stMisc.AlphaTest = (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE);
m_cbMisc.updateData(m_stMisc, m_context.Get()); m_cbMisc.updateData(m_stMisc, m_context.Get());
m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get());
@ -470,7 +467,7 @@ namespace T5M::Renderer
for (auto& bucket : mesh->buckets) for (auto& bucket : mesh->buckets)
{ {
if (bucket.Vertices.size() == 0 && bucket.blendMode == 0) if (bucket.Vertices.size() == 0 && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -1388,12 +1385,9 @@ namespace T5M::Renderer
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (bucket.blendMode == 0) setBlendMode(bucket.blendMode);
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
else
m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF);
m_stMisc.AlphaTest = (bucket.blendMode == 0); m_stMisc.AlphaTest = (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE);
m_cbMisc.updateData(m_stMisc, m_context.Get()); m_cbMisc.updateData(m_stMisc, m_context.Get());
m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get());
@ -2864,9 +2858,10 @@ namespace T5M::Renderer
} }
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
setBlendMode(bucket.blendMode);
m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0);
} }
} }
@ -3000,9 +2995,10 @@ namespace T5M::Renderer
{ {
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
setBlendMode(bucket.blendMode);
m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0);
} }
} }
@ -3028,7 +3024,6 @@ namespace T5M::Renderer
m_context->VSSetShader(m_vsRooms_Anim.Get(), nullptr, 0); m_context->VSSetShader(m_vsRooms_Anim.Get(), nullptr, 0);
} }
m_context->PSSetShader(m_psRooms.Get(), NULL, 0); m_context->PSSetShader(m_psRooms.Get(), NULL, 0);
// Set texture // Set texture
@ -3081,11 +3076,11 @@ namespace T5M::Renderer
for (auto& bucket : room->buckets) for (auto& bucket : room->buckets)
{ {
if (transparent) { if (transparent) {
if (bucket.blendMode == BLEND_MODES::BLENDMODE_OPAQUE) if (bucket.blendMode == BLEND_MODES::BLENDMODE_OPAQUE || bucket.blendMode == BLEND_MODES::BLENDMODE_ALPHATEST)
continue; continue;
} }
else { else {
if (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE) if (bucket.blendMode != BLEND_MODES::BLENDMODE_OPAQUE && bucket.blendMode != BLEND_MODES::BLENDMODE_ALPHATEST)
continue; continue;
} }
@ -3114,6 +3109,7 @@ namespace T5M::Renderer
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
setBlendMode(bucket.blendMode);
m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0);
m_numDrawCalls++; m_numDrawCalls++;
} }
@ -3266,10 +3262,7 @@ namespace T5M::Renderer
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (bucket.blendMode != 0) setBlendMode(bucket.blendMode);
m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF);
else
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
// Draw vertices // Draw vertices
m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0); m_context->DrawIndexed(bucket.Indices.size(), bucket.StartIndex, 0);

View file

@ -456,7 +456,7 @@ namespace T5M::Renderer {
RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0]; RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0];
for (auto& flashBucket : flashMesh->buckets) { for (auto& flashBucket : flashMesh->buckets) {
if (flashBucket.blendMode == 0) if (flashBucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
if (flashBucket.Vertices.size() != 0) { if (flashBucket.Vertices.size() != 0) {
Matrix offset = Matrix::CreateTranslation(0, length, zOffset); Matrix offset = Matrix::CreateTranslation(0, length, zOffset);
@ -544,7 +544,7 @@ namespace T5M::Renderer {
RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0]; RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0];
for (auto& flashBucket : flashMesh->buckets) { for (auto& flashBucket : flashMesh->buckets) {
if (flashBucket.blendMode == 0) if (flashBucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
if (flashBucket.Vertices.size() != 0) { if (flashBucket.Vertices.size() != 0) {
Matrix offset = Matrix::CreateTranslation(bites[k]->x, bites[k]->y, bites[k]->z); Matrix offset = Matrix::CreateTranslation(bites[k]->x, bites[k]->y, bites[k]->z);
@ -647,7 +647,7 @@ namespace T5M::Renderer {
} }
void Renderer11::drawSprites(RenderView& view) void Renderer11::drawSprites(RenderView& view)
{ {
UINT stride = sizeof(RendererVertex); UINT stride = sizeof(RendererVertex);
UINT offset = 0; UINT offset = 0;
m_context->RSSetState(m_states->CullNone()); m_context->RSSetState(m_states->CullNone());
@ -668,27 +668,10 @@ namespace T5M::Renderer {
for (int i = 0; i < numSpritesToDraw; i++) { for (int i = 0; i < numSpritesToDraw; i++) {
Matrix billboardMatrix; Matrix billboardMatrix;
RendererSpriteToDraw& spr = view.spritesToDraw[i]; RendererSpriteToDraw& spr = view.spritesToDraw[i];
if(spr.BlendMode != currentBlendMode){ if(spr.BlendMode != currentBlendMode)
{
currentBlendMode = spr.BlendMode; currentBlendMode = spr.BlendMode;
switch(currentBlendMode){ setBlendMode(spr.BlendMode);
case BLENDMODE_ALPHABLEND:
m_context->OMSetBlendState(m_states->NonPremultiplied(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_ALPHATEST:
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_OPAQUE:
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_SUBTRACTIVE:
m_context->OMSetBlendState(m_subtractiveBlendState.Get(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_ADDITIVE:
m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF);
break;
}
} }
m_context->PSSetShaderResources(0, 1, spr.Sprite->Texture->ShaderResourceView.GetAddressOf()); m_context->PSSetShaderResources(0, 1, spr.Sprite->Texture->ShaderResourceView.GetAddressOf());
ID3D11SamplerState* sampler = m_states->LinearClamp(); ID3D11SamplerState* sampler = m_states->LinearClamp();
@ -819,7 +802,7 @@ namespace T5M::Renderer {
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -1044,6 +1027,7 @@ namespace T5M::Renderer {
addSpriteBillboard(&m_sprites[Objects[ID_EXPLOSION_SPRITES].meshIndex + e.sprite], e.pos, e.tint, e.rotation, 1.0f, { e.size, e.size }, BLENDMODE_ADDITIVE,view); addSpriteBillboard(&m_sprites[Objects[ID_EXPLOSION_SPRITES].meshIndex + e.sprite], e.pos, e.tint, e.rotation, 1.0f, { e.size, e.size }, BLENDMODE_ADDITIVE,view);
} }
} }
void Renderer11::drawSimpleParticles(RenderView& view) void Renderer11::drawSimpleParticles(RenderView& view)
{ {
using namespace T5M::Effects; using namespace T5M::Effects;
@ -1052,4 +1036,28 @@ namespace T5M::Renderer {
addSpriteBillboard(&m_sprites[Objects[s.sequence].meshIndex + s.sprite], s.worldPosition, Vector4(1, 1, 1, 1), 0, 1.0f, { s.size, s.size / 2 }, BLENDMODE_ALPHABLEND,view); addSpriteBillboard(&m_sprites[Objects[s.sequence].meshIndex + s.sprite], s.worldPosition, Vector4(1, 1, 1, 1), 0, 1.0f, { s.size, s.size / 2 }, BLENDMODE_ALPHABLEND,view);
} }
} }
void Renderer11::setBlendMode(BLEND_MODES blendMode)
{
switch (blendMode)
{
case BLENDMODE_ALPHABLEND:
m_context->OMSetBlendState(m_states->NonPremultiplied(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_ALPHATEST:
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_OPAQUE:
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_SUBTRACTIVE:
m_context->OMSetBlendState(m_subtractiveBlendState.Get(), NULL, 0xFFFFFFFF);
break;
case BLENDMODE_ADDITIVE:
m_context->OMSetBlendState(m_states->Additive(), NULL, 0xFFFFFFFF);
break;
}
}
} }

View file

@ -276,7 +276,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -300,7 +300,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -339,7 +339,7 @@ void T5M::Renderer::Renderer11::drawLara(RenderView& view,bool transparent, bool
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -368,7 +368,7 @@ void Renderer11::drawLaraHolsters(bool transparent)
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -385,7 +385,7 @@ void Renderer11::drawLaraHolsters(bool transparent)
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices
@ -402,7 +402,7 @@ void Renderer11::drawLaraHolsters(bool transparent)
if (bucket.Vertices.size() == 0) if (bucket.Vertices.size() == 0)
continue; continue;
if (transparent && bucket.blendMode == 0) if (transparent && bucket.blendMode == BLENDMODE_OPAQUE)
continue; continue;
// Draw vertices // Draw vertices