ShaderLab: 기타 커맨드
고급 ShaderLab 항목

셰이더 에셋(Shader assets)

셰이더는 그래픽 카드 실행 코드와 명령을 가진 에셋입니다. Materials는 셰이더를 참조하며 (텍스처나 컬러 등) 파라미터를 설정합니다.

Unity contains some built-in shaders that are always available in your project (for example, the Standard shader). You can also write your own shaders and apply post-processing effects.

새로운 셰이더 생성

To create a new Shader, use Assets > Create > Shader from the main menu or the Project View context menu. A shader is a text file similar to a C# script, and is written in a combination of Cg/HLSL and ShaderLab languages (see writing shaders page for details).

셰이더 인스펙터.
셰이더 인스펙터.

셰이더 임포트 설정

This inspector section allows specifying default textures for a shader. Whenever a new Material is created with this shader, these textures are automatically assigned.

셰이더 인스펙터(Shader Inspector)

The Shader Inspector displays basic information about the shader (mostly shader tags), and allows compiling and inspecting low-level compiled code.

For Surface Shaders, the Show generated code button displays all the code that Unity generates to handle lighting and shadowing. If you really want to customize the generated code, you can just copy and paste all of it back to your original shader file and start tweaking.

셰이더 컴파일 팝업 메뉴.
셰이더 컴파일 팝업 메뉴.

The pop-up menu of the Compile and show code button allows inspecting final compiled shader code (e.g. assembly on Direct3D9, or low-level optimized GLSL for OpenGL ES) for selected platforms. This is mostly useful while optimizing shaders for performance; often you do want to know how many low-level instructions here generated in the end.

The low-level generated code is useful for pasting into GPU shader performance analysis tools (like AMD GPU ShaderAnalyzer or PVRShaderEditor).

셰이더 컴파일의 세부 정보

On shader import time, Unity does not compile the whole shader. This is because majority of shaders have a lot of variants inside, and compiling all of them, for all possible platforms, would take a very long time. Instead, this is done:

  • 임포트를 하는 경우에는 셰이더를 최소 프로세싱만 합니다(표면 셰이더 생성 등).
  • 필요할 때에 한해 셰이더 배리언트를 컴파일합니다.
  • 이 방법을 사용하면 임포트할 때 10010,000개의 내부 셰이더를 컴파일하는 대신 보통 소량을 컴파일하는 것으로 마무리합니다.

플레이어 빌드 시에는 “아직 컴파일되지 않은” 모든 셰이더 배리언트가 컴파일되므로 이러한 배리언트들이 에디터가 사용하지 않았어도 게임 데이터에 포함됩니다.

However, this does mean that a shader might have an error in there, which is not detected at shader import time. For example, you’re running editor using Direct3D 11, but a shader has an error if compiled for OpenGL. Or some variants of the shader does not fit into shader model 2.0 instruction limits, etc. These errors will be shown in the inspector if editor needs them; but it’s also a good practice to manually fully compile the shader for platforms you need, to check for errors. This can be done using the Compile and show code pop-up menu in the shader inspector.

Shader compilation is carried out using a background process named UnityShaderCompiler that is started by Unity whenever it needs to compile shaders. Multiple compiler processes can be started (generally one per CPU core in your machine), so that at player build time shader compilation can be done in parallel. While the editor is not compiling shaders, the compiler processes do nothing and do not consume computer resources, so there’s no need to worry about them. They are also shut down when Unity editor quits.

Individual shader variant compilation results are cached in the project, under Library/ShaderCache folder. This means that 100% identical shaders or their snippets will reuse previously compiled results. It also means that the shader cache folder can become quite large, if you have a lot of shaders that are changed often. It is always safe to delete it; it will just cause shader variants to be recompiled.

추가 정보

ShaderLab: 기타 커맨드
고급 ShaderLab 항목