GFX3D: Opaque polygons using A3I5/A5I3 textures are no longer considered transparent if the polygon is a Decal or Shadow polygon.
- Fixes the edge marking of blocks in Picross 3D when running SoftRasterizer.
This commit is contained in:
parent
3b74861fc2
commit
68958a7a08
|
@ -2749,7 +2749,7 @@ Render3DError OpenGLRenderer_1_2::BeginRender(const GFX3D &engine)
|
|||
}
|
||||
else
|
||||
{
|
||||
const GLfloat thePolyAlpha = (!thePoly->isWireframe() && thePoly->isTranslucent()) ? divide5bitBy31_LUT[thePoly->getAttributeAlpha()] : 1.0f;
|
||||
const GLfloat thePolyAlpha = (thePoly->isWireframe()) ? 1.0f : divide5bitBy31_LUT[thePoly->getAttributeAlpha()];
|
||||
|
||||
for (size_t j = 0; j < polyType; j++)
|
||||
{
|
||||
|
@ -3086,7 +3086,6 @@ void OpenGLRenderer_1_2::SetPolygonIndex(const size_t index)
|
|||
Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY &thePoly)
|
||||
{
|
||||
const PolygonAttributes attr = thePoly.getAttributes();
|
||||
const bool isOpaqueDecal = ((attr.polygonMode == POLYGON_MODE_DECAL) && attr.isOpaque);
|
||||
|
||||
// Set up depth test mode
|
||||
static const GLenum oglDepthFunc[2] = {GL_LESS, GL_EQUAL};
|
||||
|
@ -3137,11 +3136,11 @@ Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY &thePoly)
|
|||
else
|
||||
{
|
||||
glStencilFunc(GL_ALWAYS, attr.polygonID, 0x3F);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, (attr.isTranslucent && !isOpaqueDecal) ? GL_KEEP : GL_REPLACE);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, (attr.isTranslucent) ? GL_KEEP : GL_REPLACE);
|
||||
glStencilMask(0xFF); // Drawing non-shadow polygons will implicitly reset the stencil buffer bits
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
glDepthMask((!attr.isTranslucent || isOpaqueDecal || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE);
|
||||
glDepthMask((!attr.isTranslucent || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE);
|
||||
}
|
||||
|
||||
// Set up polygon attributes
|
||||
|
|
|
@ -1817,14 +1817,12 @@ Render3DError OpenGLRenderer_3_2::SetupPolygon(const POLY &thePoly)
|
|||
}
|
||||
else
|
||||
{
|
||||
const bool isOpaqueDecal = ((attr.polygonMode == POLYGON_MODE_DECAL) && attr.isOpaque);
|
||||
|
||||
glStencilFunc(GL_ALWAYS, attr.polygonID, 0x3F);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, (attr.isTranslucent && !isOpaqueDecal) ? GL_KEEP : GL_REPLACE);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, (attr.isTranslucent) ? GL_KEEP : GL_REPLACE);
|
||||
glStencilMask(0xFF); // Drawing non-shadow polygons will implicitly reset the stencil buffer bits
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
glDepthMask((!attr.isTranslucent || isOpaqueDecal || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE);
|
||||
glDepthMask((!attr.isTranslucent || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE);
|
||||
}
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
|
|
|
@ -452,19 +452,24 @@ struct POLY {
|
|||
|
||||
bool isTranslucent() const
|
||||
{
|
||||
const bool isOpaque = this->isOpaque();
|
||||
|
||||
// First, check if the polygon is wireframe or opaque.
|
||||
// If neither, then it must be translucent.
|
||||
if (!this->isWireframe() && !this->isOpaque())
|
||||
if (!this->isWireframe() && !isOpaque)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Also check for translucent texture format.
|
||||
u8 texFormat = this->getTexParamTexFormat();
|
||||
const u8 texFormat = this->getTexParamTexFormat();
|
||||
const PolygonMode mode = this->getAttributePolygonMode();
|
||||
|
||||
//a5i3 or a3i5 -> translucent
|
||||
if(texFormat == TEXMODE_A3I5 || texFormat == TEXMODE_A5I3)
|
||||
if ( (texFormat == TEXMODE_A3I5 || texFormat == TEXMODE_A5I3) && !(isOpaque && (mode == POLYGON_MODE_DECAL || mode == POLYGON_MODE_SHADOW)) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue