Opaque textures render over thin parts

When a thin part is placed on top of a part with a texture on top, the texture can render through the thin part.

This happens when you zoom out and/or find some special camera angle. The zoom level and angle required is related to the size of the part underneath (something something texture origin something camera z-plane?).

image

Gross.rbxl (15.5 KB)

I am using a GTX 1070.

This is an old bug, this issue seems related and lots of discussion about similar layering issues has already occurred. This issue has more impact because an opaque texture on an opaque part is rendering on top of other parts, which is absurd and makes seriously using textures in your game painful and not feasible.

This is currently impacting me because I am building a map for my game and I’ve decided to use textures for my grass parts since the grass material looks utterly dreadful. In my game characters can fly, so this camera position will certainly occur during normal play. My only option is to make the affected parts unattractively thicker so this is less likely to happen. I think I’m more likely to just stop using Textures since they seem effectively useless due to this issue.

image

Hoping custom materials come soon.

7 Likes

I have encountered this problem before, while trying to use custom textures for carpets.

We’ll see about the materials update from the roadmap and hope it can outdo textures.

The problem
The flickering you see between the almost coplanar surfaces is called “z-fighting” in computer graphics. It is a common problem among most modern 3D rendering engines and it’s caused by floating point inaccuracies and ambiguity as to the order of which coplanar surfaces should be rendered. The reason you are encountering the z-fighting issue here between a Texture and a part is because Roblox renders Textures as a separate mesh on top of its parent mesh (at least according to the rendering debug menu, Decals also behave the same way).

What I think Roblox could do
To fix this problem it is my understanding that Roblox could render parts with Textures without creating more meshes using modified pixel shaders in a separate render pass (Vulkan term). This may introduce more overhead and complexity than what Roblox is currently doing, but there are alternatives to Textures and Decals. The distance between the two parts is relatively large though for a z-fighting case, which leads me to think that there may be other solutions to this problem that I am not aware of.

What us developers can do
Here is a file where I believe I have fixed your problem using a MeshPart with its TextureId property set to a pink texture I found in the catalog. By setting the TextureId of the MeshPart instead of using a Decal or Texture, there will be no z-fighting between the Texture mesh and parts on top because a textured MeshPart is rendered as a single mesh and not two separate meshes.
Nice.rbxl (18.0 KB)

2 Likes

I’ve been experiencing this for a while on multiple places.Here I’m using a texture for the baseplate.
2 1

Excuse the quality, had to zoom.

Roblox really needs to have 64-bit vectors.
There are so many problems with 32-bit positioning, it behaves weirdly on both very small (< 0.1 studs) and very large (>100,000 studs) scales.

Thanks for the report! We’ve filed a ticket to our internal database and we’ll follow up when we have an update for you.

2 Likes