Here's a simple fix you can use when rendering a solid object like a building.
We'll copy the building and render it twice in the same location:
- Drawing only to the depth buffer, without writing any colour over the background
- Drawing translucently, only where our polygons pass the depth test (ie. only the frontmost faces)
You can use a shader like this to "reserve" this object's surface position in the depth buffer after the other opaque geometry has rendered, while leaving the background as-is:
Shader "Unlit/DepthReserve"
{
Properties
{
}
SubShader
{
Tags { "RenderType" = "Opaque" "Queue"="AlphaTest+1" }
LOD 100
Blend Zero One
Pass
{
}
}
}
(Here I'm abusing the blending to just ignore our material and output the background colour. There may be a more efficient way to skip computing a colour to blend at all.)
When we render without this depth-reserving pass, the translucent triangles can get drawn in any random order, so stuff that's behind can render in addition to / on top of stuff that's in front - see the internal structure of the windowsills & wells visible on the left below. When we write the depth buffer first, we block all but the frontmost face at a given pixel from rendering, so we get a result like the one on the right, with a more expected translucent layering effect:

