Writing vertex and fragment shaders

ShaderLab 쉐이더는 단순히 "hardware shaders"보다 더 많이 둘러싸고 있습니다. 그들은 많은 것들을 합니다. 그들은 제재 인스펙터에서 보여지는 속성들을 설명하고 다른 그래픽 하드웨어를 위해 다수의 쉐이더 구현을 포함합니다. 그리고 정해진 함수 하드웨어 상태를 구성합니다. 꼭지점 그리고 프래그먼트 프로그램처럼 실제 프로그램이 가능한 쉐이더는 전체ShaderLab의 쉐이더 컨셉의 단지 한 부분일 뿐입니다. 기본적인 지시사항을 위해서 shader tutorial를 살펴보시기 바랍니다. 우리는 낮은 레벨의 하드웨어 shader programs를 부를 것입니다.

_사용자가 조명과 상호작용하는 쉐이더를 쓰기를 원한다면 Surface Shaders 서류를 살펴보시기 바랍니다_. 이 페이지의 나머지 부분은Unity조명과 상호작용하지 않는 쉐이더를 가정할 것입니다 (예. 특수 효과, Image Effects 등.)

쉐이더 프로그램은 쉐이더 텍스트에 미리보기를 끼워넣음으로서 Pass 명령안에 어딘가에 Cg / HLSL 언어로 쓰여집니다. 그들은 이것처럼 보입니다:

Pass {
    //// ... the usual pass state setup ...//
    
    _CGPROGRAM_
    //// compilation directives for this snippet, e.g.://
    _#pragma vertex_ vert
    _#pragma fragment_ frag
    
    //// the Cg code itself//
    
    _ENDCG_
    //// ... the rest of pass setup ...//
}

Cg snippets

Cg 프로그램 미리보기는 CGPROGRAMENDCG사이에서 쓰여집니다.

미리보기의 시작에서 컴파일 지시어는 #pragma 문장으로 주어질 수 있습니다. Unity에 의해 인식되어지는 지시어는 다음과 같습니다:

  • #pragma vertex name - 함수 name가 꼭지점 프로그램임을 나타냅니다.
  • #pragma fragment name - 함수 name가 프래그멘트 프로그램임을 나타냅니다.
  • #pragma fragmentoption option - 컴파일된OpenGL 프래그먼트 프로그램에 option을 추가합니다. 사용가능한 옵션의 리스트를 위해서 ARB fragment program 상세 내용을 살펴보시기 바랍니다. 이 지시어는 꼭지점 프로그램이나OpenGL이 아닌 타겟으로 컴파일된 프로그램에서는 영향을 가지지 않습니다.
  • #pragma target name - 어떤 쉐이더 타겟이 컴파일이 될지를 나타냅니다. 자세한 내용을 위해서 shader targets를 살펴보시기 바랍니다.
  • #pragma only_renderers space separated names - 주어진 렌더러만을 위한 쉐이더를 컴파일합니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.
  • #pragma exclude_renderers space separated names - 주어진 렌더러들을 위해서 쉐이더를 컴파일하지 않습니다. 기본적으로 쉐이더는 모든 렌더러를 위해서 컴파일 됩니다. 자세한 내용을 위해서 renderers를 살펴보시기 바랍니다.

각각 미리보기는 꼭지점 프로그램이나 프래그먼트 프로그램 또는 둘 다를 포함해야만 합니다. 그러므로 #pragma vertex 또는 #pragma fragment 지시어가 또는 둘 다 필요되어 집니다.

target

Shader targets

기본적으로 Unity는 동등한 쉐이더 모델 1.1로 꼭지점 프로그램을 컴파일하고 쉐이더 모델 2.0으로 프래그먼트 프로그램을 컴파일 합니다. #pragma target을 사용하는 것은 쉐이더가 다른 레벨로 컴파일 되는 것을 허락합니다. 현재 이러한 타겟들이 지원됩니다:

  • #pragma target default - 기본 타겟으로 컴파일:
    • Direct3D 9에서 Vertex shader 1.1 그리고 pixel shader 2.0.
    • 128 인스트럭션 제한을 가진 ARB_vertex_program 그리고 96 인스트럭션 제한을 가진 ARB_fragment_program (32 텍스쳐+ 64 산수), 16 일시적인 레지스터와 4 텍스쳐 우회.
  • #pragma target 3.0 - 쉐이더 모델 3.0으로 컴파일:
    • Direct3D 9에서 Vertex shader 3.0 그리고 pixel shader 3.0.
    • 인스트럭션 제한을 가지지 않는 ARB_vertex_program 그리고1024인스트럭션 제한을 가진ARB_fragment_program (512텍스쳐+ 512산수), 32일시적인 레지스터와4 텍스쳐 우회. #pragma profileoption directive 지시어를 사용해서 이러한 제한을 덮어쓰는 것은 가능합니다. 예 #pragma profileoption MaxTexIndirections=256은 텍스쳐 우회 제한을 256으로 올립니다. derivative 지시사항과 같은 몇몇 셰이더 모델 3.0 기능들은 ARB_vertex_program/ARB_fragment_program 에 의해 지원되지 않습니다. 당신은 제한이 덜한 GLSL로 대신 번역하기 위해 #pragma glsl를 사용할 수 있습니다. 3.0 타겟으로 컴파일 할 때 꼭지점과 프래그먼트 프로그램 둘 모두 존재해야 합니다.

renderers

Renderers

Unity는 몇몇의 렌더링APIs를 지원하고 (예. Direct3D 9 와 OpenGL), 기본적으로 모든 쉐이더 프로그램은 지원되는 렌더러를 위해서 컴파일 되어 집니다. 사용자는 어떤 렌더러가 컴파일되는지 #pragma only_renderers 또는 #pragma exclude_renderers 을 사용해서 지정할 수 있습니다. 이것은 사용자가 오직Mac OS X(Direct3D은 없습니다)만을 타겟으로 할 것이라는 것을 안다면 또는 오직Windows만을(Unity가 D3D을 기본적으로 정하는 곳에서) 또는 어떤 특별한 쉐이더만이 오직 가능하다면 매우 유용합니다. 현재 지원되는 렌더러의 이름은 다음과 같습니다:

  • d3d9 - Direct3D 9.
  • opengl - OpenGL.
  • gles - OpenGL ES 2.0.
  • xbox360 - Xbox 360.
  • ps3 - PlayStation 3.
  • flash - Flash.

예를 들어 이 라인은 쉐이더를D3D9 모드로 오직 컴파일 할 것입니다:

#pragma only_renderers d3d9

Subsections

역링크