Search Unity

타일러블 텍스처(tileable texture)를 사용하여 넓은 표면을 덮거나 메시에 세부적인 디테일을 더한 적이 있으신가요? 그렇다면 타일링 값이 높아지면서 반복 패턴이 빠르게 나타나는 것을 보셨을 것입니다. 이런 문제를 피하기 위해 Unity Labs는 절차적 랜덤 텍스처링(Procedural Stochastic Texturing)이라고 하는 새로운 텍스처링 기술을 개발했습니다.

타일러블 텍스처는 3D 씬에 디테일을 더하는 유용한 툴입니다. 하지만 타일러블 텍스처와 디테일 맵을 사용해서 넓은 영역을 텍스처링하거나 난이도가 높은 디테일이 적용된 표면을 구현하려고 할 때마다 타일링 패턴이 나타납니다(아래 왼쪽 이미지). 일반적으로 반복되는 패턴을 줄이려면 텍스처를 늘리거나, 오브젝트를 추가하여 반복 패턴이 보이지 않게 가려야 합니다. 이 블로그 게시물에서는 녹, 이끼, 나무껍질 등 임의의(stochastic) 형상으로 이 텍스처 관련 문제를 해결하는 플러그인을 제공합니다. 플러그인의 효과는 오른쪽 이미지에서 확인하실 수 있습니다.

일반적인 텍스처링을 적용한 녹슨 금속 머티리얼(좌측)과 Unity의 기술을 적용한 녹슨 금속 머티리얼(우측)

여기에서 플러그인 다운로드

입력 텍스처가 제공되면 이 플러그인에서는 입력 형상에 맞는 무한히 큰 텍스처를 절차적으로 생성합니다. 이 작업을 위해 수정된 입력 텍스처 버전에 적용되는 최신 텍스처 블렌딩 함수를 사용(프래그먼트당 텍스처 샘플 3개만 필요)하고, 소규모 룩업 테이블을 불러옵니다. 이 플러그인이 있으면 타일링 작업이 필요 없어지므로 반복 아티팩트 없이 디테일 수준(LOD)은 높이면서, 더 적은 텍스처로 더 넓은 표면을 덮을 수 있습니다.

StandardStochastic 셰이더 사용

이 플러그인에는 스탠다드 셰이더의 배리언트가 Unity 패키지에 포함되어 제공됩니다. 패키지를 임포트한 다음 머티리얼에 대해 StandardStochastic 셰이더를 선택합니다. 인터페이스는 스탠다드 셰이더와 동일하지만 상단에 2가지 필수 설정 단계에 그에 상응하는 새로운 컨트롤 2개가 다음과 같이 추가됩니다.

 

  1. Stochastic Inputs 메뉴에서는 어떤 입력 텍스처에 이 기술을 활성화할 것인지 지정(Everything으로 설정하거나 알베도, 노멀 맵 등 특정 텍스처로 설정 가능)할 수 있습니다.
  2. Apply 버튼을 누르면 선택한 임의의 입력에 대한 데이터를 사전에 계산하고 머티리얼을 업데이트하여 프로세스를 완료합니다. 이 단계에서는 각 입력 텍스처에 대해 동일한 폴더에 임시 텍스처(intermediate texture) 2개를 생성합니다.

추가 참고 사항:

  • 기존에 임시 텍스처가 존재할 경우 생성 단계를 생략하고 그대로 로드되기 때문에 원본 텍스처를 수정하려면 기존의 임시 텍스처를 모두 삭제한 후 다시 Apply 버튼을 눌러서 강제로 재생성합니다.
  • 스탠다드 셰이더와 StandardStochastic 셰이더 간에 전환하는 경우 파라미터가 상호 간에 이동합니다.
  • StandardStochastic(스페큘러 설정) 셰이더는 스페큘러 워크플로를 사용하는 머티리얼에도 제공됩니다.

 

다음은 작은(256²) 입력 텍스처를 사용하여 다양한 머티리얼로 작업 중인 프로토타입의 예를 보여줍니다.

알베도, 노멀, 오클루전 텍스처가 적용된 목재 디테일 맵

 

알베도, 노멀, 오클루전, 하이트 텍스처가 적용된 암석 머티리얼

 

알베도, 노멀, 메탈릭/평활도 텍스처가 적용된 철제 머티리얼

한계

이 기술은 거리를 두고 보았을 때 랜덤 노이즈와 유사한 텍스처와, 정밀한 기하학적 형태가 없는 자연스러운 머티리얼과 같은 타일러블 랜덤 텍스처 또는 랜덤에 가까운 텍스처에만 사용 가능합니다.

피드백

이 기술은 연구용 프로토타입이며 현재 개발 중인 것은 아니므로 유지 관리나 서비스 지원을 보장하지는 않습니다. 하지만 질문이나 의견이 있으면 Unity 포럼에 자유롭게 적어주시기 바랍니다. 현재 유니티는 새로운 렌더링 파이프라인과의 호환성 및 커스텀 셰이더에 적용할 셰이더 그래프를 구현하려고 노력하고 있습니다. 포럼 스레드에서 새로운 소식을 확인해 보세요.

 

읽을거리

이 플러그인이 어떻게 동작하는지 궁금하신가요? Unity 플러그인의 기반이 되는 주제에 대해 최근에 게재된 다음 연구 논문 2개를 읽어보시기 바랍니다.

 

이 플러그인과 함께 제공된 코드 주석은 위 기술 소개 부분의 특정 섹션을 참고하여 작성되었습니다.

 

35 코멘트

코멘트 구독

코멘트를 달 수 없습니다.

  1. have an unlit version?

  2. For everyone asking about terrain, I shipped a variation on this technique in MicroSplat’s Texture Cluster module this morning. It replaces the Histogram Preserving operator in the paper with a height blend, which removes the need for preprocessing the textures into custom formats, generating lookup tables, etc.. Results are also posted in the forum thread.

  3. Absolutely love this, as I was searching for a tech like this just a couple of days ago. Will go directly into a new project… Thumbs up!

  4. Seyed Morteza Kamali

    2월 16, 2019 6:31 오전

    Super Cool!!!

    1. that is quite expensive for a simple shader: 0.035 vs 0.2 ms.

      1. Which is dramatically faster than alternatives that offer similar results.

  5. I love this kind of stuff:)

    Unity 2017 compatibility would be nice, but i understand if it’s not possible.

    Nice work either way.

  6. Very nice!
    Any notes on GPU cost vs simple tiled texture?
    Mobile use realistic?

    1. We have some performance comparisons on page 20 of the technical chapter:
      https://drive.google.com/file/d/1QecekuuyWgw68HU9tg6ENfrCTCVIjm6l/view
      It is on average 4-5 times slower than simple tiling. Although you can trade performance for memory by using smaller textures than you would normally need to avoid repetition patterns (all of the renders in this post are with 256² textures), which could be a win for some mobile projects.

  7. Please add this option to terrain in hdrp, or give us terrain node into shadergraph

  8. This tool is great and we could use for it for a big project.
    There is one thing though that would make it even better : handling multiple selection.
    In our case, we are procedurally generating textures in another tool and would need to apply this shader to materials with our textures.
    To do that, we created a menu item that checks for textures in a folder, create materials in another one, apply this shader to the materials and set the material’s texture’s “_MainTex”.
    The problem is that to trigger the “apply” function, we would have to tweak the StandardStochasticShaderGUI class ourselves since selecting more than one material at a time and clicking on “Apply” will result in the same texture being applied to all of them :/

    Anything you could do about it ?

  9. This is major! Texture repetition has never been fully solved before. Artomatix had an implementation but that is currently not available (I believe they are working on it though). Please integrate this into Unity with full support. It is too valuable to let it get moldy in just another cool but forgotten research project.

    1. Thanks for the feedback ! We are planning on doing a proper release in ShaderGraph as a texture sampler node, making it available for most users in the new render pipelines.

      1. That would be awesome! Any ETA on this?

  10. Hey! Any plans to support this in the lightweight or high-def pipelines?

    1. We are planning on implementing it as a ShaderGraph node, which would make it usable with the new render pipelines in custom shaders.

  11. Just tested:
    A long awaited dream finally comes true.
    Hopfully this will be integrated in the next releases.

  12. Very cool. This helps to solve one of the bigger issues that the standard shader has and honestly I’m all for this. Is there a chance that this shader will also come to the scriptable render pipelines as well? Or do they already have something like this?

  13. veteran person guy dude

    2월 15, 2019 3:00 오전

    ImageSynth was cool in 2003… so this in 2019 is a bit YAWN… UNLESS you add this; that the texture space is used for a scaleable texel ratio and for the shader to tile within that space.
    THEN YOU’D HAVE SOMETHING NEW. #DURRRRRRRRRRRRRRRRRRRRR

    1. Do it yourself.

  14. Another great post – back to back with that Shader Graph Vertex Effect – Thanks once again!
    No problems when trying it out in 2018.3.0f2

  15. Strange, i’m using unity 2018.3.5f1 and receiving a:
    Assets/Editor/StandardStochasticShaderGUI.cs(587,12): error CS1644: Feature `byref locals and returns’ cannot be used because it is not part of the C# 4.0 language specification
    I wonder why?

    1. What version of .NET are you using? You can check in the player settings. It should be 4.x.

      1. Thanks for noticing that, the .Net 4 requirement is unnecessary and slipped in, will fix it!

      2. CoolioNotTheRapper

        2월 15, 2019 10:57 오전

        I’ve set it up as Net 4.x and the problem persists. Using Unity 2018.2.20f1.

  16. Looks very promising! Can’t wait to get my hands on this!

  17. Impressive work. Will this work with Unity terrain?

    1. I have exactly the same question!

    2. Great question, this would be amazing on a terrain

    3. The technique can be used with terrain shaders, but that will require manual implementation. The main purpose of this prototype is to make the code available in C# and shaders for Unity developers to use in their own code where they need it. Although we hope to have the technique released as a new ShaderGraph node in the future, for easy integration in custom shaders.

      1. You say it works for terrain, would there be support or a workaround to have seamless neighboring terrains aswell?

  18. AMAZING WORK! Way more efficient than Wang Tiles. Way to go guys!

  19. Awesome! One question: which Unity versions are compatible with this plugin?

    1. Currently it works with the last Unity 2018 releases in the built-in render pipeline. Since the plugin plugs into parts of the Standard Shader code, and some of that has evolved since the initial release in Unity 5, it’s not working with older versions as it is.

      I will be backporting it in the coming days as separate packages for older popular versions of Unity, mainly Unity 5.6!

      1. I could kiss you.