ShaderLab: 그 외의 커맨드
상세한 ShaderLab 항목

쉐이더 에셋

쉐이더는 그래픽 카드가 실행하는 코드와 명령이 포함된 에셋입니다. Material(머티리얼))은 쉐이더를 참조하여, 해당 파라미터(텍스처나 색상 등)를 설정합니다.

Unity에는 몇 가지 내장 쉐이더가 포함되어 있으며, 이들은 프로젝트에서 언제든지 사용 가능합니다. (예: Standard 쉐이더). Image Effects(이미지 효과) 패키지에도 이미지 후처리용 쉐이더가 많이 포함되어 있습니다. 또한, 자신의 고유한 쉐이더를 작성하는 것도 가능합니다.

새로운 쉐이더 만들기

새로운 쉐이더를 작성하려면, 메인 메뉴에서 Assets->Create->Shader를 사용하거나 Project View 컨텍스트 메뉴를 사용하세요. 쉐이더는 C# 스크립트와 비슷한 텍스트 파일이며, Cg/HLSL과 ShaderLab 언어의 결합으로 작성됩니다. (자세한 내용은 쉐이더 작성 페이지를 참조하십시오.)

쉐이더 인스펙터
쉐이더 인스펙터

쉐이더 임포트 설정

이 인스펙터를 통해서 쉐이더 텍스쳐의 기본값을 지정할 수 있습니다. 이 쉐이더에서 새 Material(머티리얼)이 생성될 때마다 이 텍스처들이 자동으로 할당됩니다.

쉐이더 인스펙터

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.

Shader compilation popup menu.
Shader compilation popup menu.

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).

쉐이더 컴파일의 세부 정보

Unity는 쉐이더 임포트 타임에서, 모든 쉐이더를 컴파일하는 것은 아닙니다. 왜냐하면 대부분의 쉐이더가 내부에 많은 variants(변형)를 가지고 있으며, 그 모두를 모든 플랫폼용으로 컴파일하면 매우 시간이 걸리기 때문입니다. 대신에 아래의 방법을 취하고 있습니다:

  • 임포트 타임에서는, 최소한의 쉐이더 처리(서피스 쉐이더의 생성 등)만 합니다.
  • 쉐이더 변형에 대한 컴파일은 실제 필요에 의해서만 합니다.
  • 100 ~ 10000개의 내부 쉐이더가 컴파일하는 작업 대신, 이 방법이라면 단지 소량을 컴파일하는 것으로 끝납니다.

플레이어 빌드 타임에서, 모든 “아직 컴파일되지 않은” 쉐이더 이형들이 컴파일되기 때문에, 에디터가 그것들을 사용하지 않았어도 게임 데이터에 포함됩니다.

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 항목