The Perfect Tile System - New Official Thread

1.2 Updates for UE 4.11!

The Perfect Tile System - Coming to the Marketplace Tomorrow!

(Please watch in HD for clearer video and 60fps)

The Perfect Tile System is a material shading system built to handle large variations in tiles, bricks, wooden paneling, and much, much more. It was designed for architectural visualization and architectural surfaces for games. The system can scale from low-end console to high-end PC hardware with support for parallax occlusion and tessellation. Mid-level support is also very strong, with features like iterative parallax which efficiently removes distortion from basic parallax, falloff blending to simulate grout occlusion at a very low cost, and a variety of dual surfacing options. The system comes with 52 presets, a variety of textures, normal maps, displacement maps, masks, and tile maps to let you create your own presets right away. It is surprisingly easy to tailor an existing preset’s colors and features to match your own needs. And to help you get started, a PDF user guide is included with the package so you can make your own Perfect Tiling shaders with ease.

Whatever your needs may be, the Perfect Tile System provides a full-scale material package for you. I’m sticking to my initial promise of selling the system for $15, and it will be released on the marketplace tomorrow! I also have plans for further development with this shader, and I am experimenting with some new features. All further progress with this shader will be posted right here on this thread. Stay tuned for further updates!

Looks quite extensive. Good work. My only suggestion is to use reroute nodes for your shader graph. It looks…complicated.

Haha, thanks, Osok! Unfortunately, I don’t believe the material editor has reroute capabilities. So, everything has to connect to everything else, so, enjoy the spaghetti and meatballs, it’s delicious.

Guys, I just uploaded a basic tutorial for how to import assets into the system and make your own Perfect Tile shader. In this demo, I made a brand new brick preset. It’s really super easy. Check it out if you’re still wondering how to use this system :slight_smile:

Congrats on the imminent release! I love the professional presentation in your video. Good luck!

Thank you, Obsidiaguy! Yeah, I really enjoy making videos. And professional presentation really should be expected! You can also expect to see more videos as I get the chance to make them :slight_smile:

Hi mariomguy,

Your system looks awesome! Question though: Will this work with modular assets? Suppose I have 2 wall models which will be in the scene standing next to eachother, will I be able to use your tiling system to texture the walls without seams? Or will the tiling only work on 1 model?

Hi Martin Bean! Unfortunately, the system tiles by texture coordinates, so if you want to use the system on two assets adjacent to each other, the tile map values will not seamlessly tile across multiple assets. You can see this happening more clearly when viewing the bricks in the example map: the texture, normal map, and masks tile perfectly together because the texture tiles exactly twice across, , but the tile map (the map beneath which generates the large variation) does not. You can disable the tile map and still make use of the color adjustment, tiling adjustment, and parallax settings (among many others), but you’d be missing a key feature of the system. Simple UV sheets and BSPs work great for this system, and you can use the material on modular assets (say, an LED sign with light-up panels for lettering), but they won’t just tile seamlessly next to each other.

It is possible to get this system to work the way you described: instead of using texture coordinates, I can tile everything using world coordinates. It will be like planar mapping the material that works cleanly over multiple meshes. This has been one of my greatest wish-list features for the last few months. The only thing slowing me down is thinking how advanced features like parallax occlusion and texture tile distortion, which currently use texture coordinates to calculate all that stuff, would work in a world-space system. Worst case scenario, they’d be marked as incompatible. I’ll have to experiment with this and get back in touch with you. In the meantime, expect to use the material on a single surface. It works splendidly that way :slight_smile:

Hi mariomguy: thanks for the explanation :slight_smile: Even though I was hoping it would work, I still bought Perfect Tiling System. Excellent piece of work for a very good price!

I will keep an eye on this thread to see what you will come up with.

I’ll look into world coordinates, good idea… perhaps it solves my problem :slight_smile:

Thank you! I have a development list on my blog, arranged from highest to lowest priority. Priority doesn’t mean it will get done sooner, just my perception of what is more important to what is least important. If something is easy to do and results in a decent amount of optimization, it may have a higher priority than something that is more optimized but difficult to manage. And a new feature that adds functionality that was previously impossible may have a higher priority than a new feature that just makes something easier.

High Priority

  1. Inclusion of Roughness maps for surface detail (requires full-scale integration with the tile distortion and parallax features).
  2. Switch between linear and sRGB assets (the dual color algorithm makes this very difficult).
  3. Tiling optimization using custom UVs for global scale.
  4. Toggle world-space coordinates (must also work with parallax and texture tile distortion).

Medium Priority

  1. Colored Tile Maps (easy to implement for linear color, difficult for sRGB).
  2. Optimum Map that combines TM, metal map, glass map, and scattering maps all in one texture. Parameter masked with RGBA values to eliminate the need for extra draw calls with heavy TM materials.
  3. Optimum Map 2 for displacement, roughness, and custom AO.
  4. Ability to toggle tiling with
  5. Special tiling for bricks and panel flooring to convert pixel TMs into more complex TMs, uses instructions but saves texture space and time in bitmap editor (parallax makes this difficult).

**Low Priority

  1. Detail texturing (requires another pipeline to be added. Not too difficult, just time consuming).
  2. Tile randomizer (must also be compatible with texture tile distortion).
  3. Simple gamma corrector to save instructions on colors (but will result in less accurate colors).


OK, I finally managed to get a better complex roughness system going! You can now import a roughness map for fully artistic PBR materials. The roughness map works with all forms of parallax, including Parallax Occlusion, and texture tile distortion. Here, the bigger problem wasn’t that, but actually getting good variation per-tile without the bright and dark values on the TM dictating it (bright is always rough, dark is always smooth).

I’ve figured out a handy seed solution to make sure there is no correlation between the dark/bright values on the Tile Map and roughness at all: there is a 1*2 pixel texture of a single black and a single white pixel. The GPU will filter the texture and smooth it out so it covers a full range of grayscale values, and the TM will shift the UVs of this small texture around to locating a random value per-tile. Because the texture is only 2 pixels, there’s a very small memory footprint involved, and it only requires 6 instructions (even less if I removed the ability to control the final values). It also makes use of shared samplers, so the extra texture is practically invisible on DX 11 projects. I will try to incorporate this seed method for other areas of the system because it’s very flexible, saves a ton of memory, and the cost of use is incredibly small! You can also import a custom roughness TM to take care of your large-scale variation if you have a specific look in mind.

For non-DX 11 folks, don’t worry, I didn’t forget about you! I built another solution to get roughness variation without needing another texture map using a method I like to call single-channel hue shift: it functions similarly to a hue shift, but only for one channel. It will rearrange the order of values and shift them forward. Unfortunately, this method requires 8 instructions and darker tiles on the tile map still show up very smooth all the time.

The two images below show off the roughness map and variation, but the feature set is not final. On top of all that, I also cleaned up the arrangement of a lot of nodes and prepped the global tiling system for further updates. I want to get world space tiling and custom UVs here, so all this work will make that much easier. I also redid the brick normals and made them a lot less ugly. Yay, less ugly! :slight_smile: I’ll see how I can incorporate this seed method into other TM areas of the code, and once that’s all done, I think we’ll be ready for another update!


OK, I have a few updates for everyone regarding the next update:

New Updates:

  • The Perfect Tile System can now tile in World Space! Tile it seamlessly across floors or ceilings and multiple objects. The system will retain it’s size regardless of the size of the object. World Space tiling is in Beta because the normal maps do not always provide accurate normals with the new tiling method. But overall it functions as expected, and to my surprise, even with Parallax Occlusion!
  • Colored Tile Maps no longer in Beta. You can now add a splash of color to all your TMs for infinite color variations!
  • Fixed a bug where Parallax Occlusion mapping caused local tiling to become disabled. Now you can control local texture tiling with Parallax Occlusion. This required a small change to the major UV pipeline of all texturing systems, but I’m happy to report that the solution is now ironclad. You can toggle between any feature in the system and none of the tiling textures will shift anywhere.
  • Fixed a bug where parallax/iterative mapping causes the displacement map to not tile appropriately throughout the system. Again, this was part of the major pipeline fix. It should now be perfectly stable.
  • Included a toggle for metallic shading (extra shader work to make metallic tiles appear to gleam). Costs/saves 3 instructions.
  • Included a toggle for cheaper gamma correction using a multiply node instead of power (2.0 instead of 2.2). Costs/saves 3 instructions.

Old (Unreleased) Updates:

  • Included the ability to take advantage of Roughness maps for full physically based rendering with the system. You can now use roughness maps as well as textures and normals to achieve a truly perfect result.
  • Dual Roughness now has a custom dual solution separate from the Tile Map: this way, the same colored tiles do not have to share the same roughness values.

There will be some more testing and improvements before the next update commences.

Attention all former and future buyers: due to a glitch, the PDF User Guide was accidentally removed from the download. Don’t panic though, I have a Dropbox link right here. I’m working with Epic to make sure the file is reinstated for future downloads, but if you’d like to download the file to better understand the features of this system, or if you’d like to look through it to see if this product is something you’re interested in buying, just click the download link below! It was intended to print into a duplex booklet on 8.5"x11" paper.

Hey guys! Sorry for being missing in action the last few months. I got a new job, so I can’t work on this system as much as I would like to (pretty exciting, but sad at the same time). Nevertheless, I have some pretty huge announcements to make about the upcoming 1.1 release:

If you hadn’t realized, Epic’s own Ryan B. released a new Parallax Occlusion method a couple months ago. I’m pleased to say that it looks very nice, works very well, and offers a few more features than the old POM: you can now render shadows in your POM materials! AND you can use pixel offset to get amazing post process AO and accurate depth silhouetting! All of this has been fully integrated in the Perfect Tile System! And, to make your life easier, I made a simple blueprint actor that will retrieve the sun’s position and feed it into all your Perfect Tiling materials! Just place the blueprint in the level, and presto! The 1.1 release will include Ryan B’s POM as a material function for you all to enjoy! Check out the results on the Temple Stone preset in the picture below!

Aside from that, I also included the ability to use an “Optimum TM Map” to use the 4 channels of a single texture to retrieve accurate TM values for 4 different purposes: TM brightness values, metallic, glass, and glass scattering. I will also include an “Optimum Physical Map” to merge roughness maps, displacement maps, AO maps, textures, and tile masks together. If you are building for consoles that do not support DX-11, this will allow you to use some of the most advanced features of the Perfect Tile System without blowing out your texture budget. Currently, the preset “Plutonium” requires 9 texture draw calls. After the implementation of Optimum Maps is completed, it will only require 3 texture draw calls.

It’s going to take a bit of time for me to get everything ready for a proper update, but currently I plan on 1.2 being the last major update. 1.1 will feature just about everything I ever wanted to do with this system. It will be huge!


Sounds good. Will purchase when updated.

Guess what, Slinky Muffins? It’s updated! Here’s the changelog:

  • Roughness maps - Now you can finally use the full range of PBR shading in UE4!
  • Independant roughness TM - Along with detail textures, you can also specify roughness variation amount per-tile.
  • Ryan B’s POM with shadows - New POM calculation allows you to use shadows and direction
  • Sun Direction material parameter collection and blueprint - Allows you to pull sun direction from the directional light in level for accurate POM shadow direction
  • Colored Tile Maps - Tile maps can now be colored, allowing you to manually color individual tiles with the full range of RGB values and colors
  • Tiling in world space - You can map the system in XYZ coordinates so it works flat on a wall, floor, or ceiling, and tiles seamlessly across multiple meshes, even if UVs are not set up on them
  • Fixed bug - POM disabled local tiling
  • Fixed bug - Parallax/Iterative caused displacement to tile incorrectly
  • Toggle for Metallic shader - Previously set to on all the time
  • Toggle for cheaper gamma correction - Previously set to on all the time
  • Optimum Maps - Use individual channels of one texture map for all areas that used to be handled by the Tile Maps. Can save draw calls on PS4/OpenGL systems, but wastes more memory (Shared samplers are still preferred for DirectX 11 systems)

If you download the Perfect Tile System from the Marketplace right now, you will get all these great upgrades! If you already downloaded it, please re-download the newer version to make use of all the added features and bug fixes.

The user guide has been updated to reflect all of these changes. If you’d like to download the user guide, it is available as a free download right here:

As a side note, I’d like to mention that the money I earned from selling this system so far has allowed me to upgrade my graphics card from a GT 640 to a GTX 960! Everything runs so smoothly now, it’s fantastic! Thanks to everyone who supported this project!

As for the future of this system, it is currently doing most of what I really wanted it to do. The system is finally optimized for PS4 and OpenGL platforms. I can try to make Optimum textures to improve draw call performance on mobile devices, using a single four-channel compressed texture VS 4 individual uncompressed textures for things like parallax, AO, and roughness, but in my experiments it was much more difficult to accomplish than I anticipated. I can’t swap out texture objects, so the iterative parallax and POM material functions will be tricky to set up. I would have to explode the size of the shader to twice the size it already is right now to make a seamless workflow for something like that (plz don’t make me do this). It already works on mobile as it is, optimized for most of the basic things you want to do. If you want custom AO, custom roughness, diffuse textures, colored TMs, and parallax displacement on a mobile platform, as of right now, good luck. You can do it, it just takes a new draw call for each texture. Except for the diffuse texture, none of them can be compressed, either.

Stuff like tile randomizing (shifting tiles around to get a less orderly appearance), detail metallic (high-res texture for up-close metal definition), detail texturing (layering one texture on top of another to improve detail), double-masks (using two textures to generate the final mask, great for chipped tiles), the aforementioned Optimum texture (displacement, roughness, AO, detail metal in one texture), and the possibility of actually supporting translucent rendering would be a dream for me to integrate with the current system, but with each new feature like that, the complexity gets tougher and tougher and tougher. At this point the project has basically spiraled beyond the limits of what I can do. I mean, this thing has been a year-long undertaking! 14 months ago was the first day I posted about this system. And right now, there isn’t a single system out there that is this good at eliminating the tiling look from repeated textures: no Substance, no Photoshop tutorial, and no graphics tutorial has managed to get to the point where you can feasibly render half a square mile of tiling bricks, and with as much ease as this system. For that, I am truly proud.

I may revisit this project again to integrate those final upgrades. But until then, keep on creating!

UPDATES! These will come in the next update of the Perfect Tile System to be compatible with UE 4.11:

  • The new 4.11 engine update improved parallax occlusion rendering SIGNIFICANTLY. Materials that used to cost 300-400 instructions now only cost 220.
  • Optimum texture maps are now finally built in! You can now store roughness, ambient occlusion, tile masks, and displacement maps in the channels of a single texture, saving 2/3 to 3/4 the memory cost of using individual textures the old way.
  • New material preset and textures to fully take advantage of this: Advanced Bricks. No texture used was more than 512x512 in size, and the combination of textures does not exceed 1 MB in space. It’s a nice sculpted brick look, and quite colorful.
  • I’m also making a basic home with furnished content to demonstrate some of the perfect tile system in an architectural home setting.

I’ll keep you guys updated on things. For now, here’s a sneak peak of the new preset:


Great to hear about the new update, one of my favorite toolsets on the marketplace

Hey dude… just thought it might be worth mentioning you’ll probably get a few more sales if you include a link to the marketplace page :stuck_out_tongue:

Thanks! I hope to get the update out as soon as I possibly can. There are some issues with optimum textures and parallax, but I have a new plan that should allow anyone to select any texture channel they want and use it for parallax/iterative parallax/parallax occlusion. There are also some very small optimizations I want to make under the hood. Hopefully I can roll those out in a few day’s time! :slight_smile:

I’d like to see what you, and everyone else have been making with this system. Feel free to post your stuff on this thread! It might give me some ideas for more improvements down the line!

Haha, well, thank you for the plug!