Version: 2017.1
여러 셰이더 프로그램 배리언트 만들기(Making multiple shader program variants)
Unity에서 사용하는 셰이딩 언어(Shading Language used in Unity)

GLSL 셰이더 프로그램(GLSL Shader programs)

Cg/HSL 셰이더 프로그램을 사용함과 더불어 OpenGL 셰이딩 언어(GLSL) 셰이더를 직접 작성할 수 있습니다.

하지만 원시 GLSL은 테스트용으로만 사용하거나 타겟이 Mac OS X, OpenGL ES 모바일 디바이스 임을 알고 있는 경우에만 사용하는 것이 좋습니다. 모든 일반적인 경우에는 Unity가 필요할 때 Cg/HLSL를 최적화된 GLSL로 크로스 컴파일합니다.

GLSL 스니핏

GLSL 프로그램 스니핏은 GLSLPROGRAMENDGLSL 키워드 사이에 작성됩니다.

GLSL에서는 모든 셰이더 함수 엔트리 포인트를 main()이라고 해야 합니다. Unity는 GLSL 셰이더를 로드할 때 소스를 VERTEX 프리프로세서 정의를 사용하여 버텍스 프로그램을 위해 한 번 로드하고 FRAGMENT 프리프로세서 정의를 사용하여 프래그먼트 프로그램을 위해 한 번 더 로드합니다. 따라서 GLSL 스니핏의 버텍스 및 프래그먼트 프로그램 부분을 분리하려면 #ifdef VERTEX .. #endif#ifdef FRAGMENT .. #endif로 둘러싸는 방법을 사용합니다. 각 GLSL 스니핏에는 버텍스 프로그램과 프래그먼트 프로그램이 모두 포함되어야 합니다.

스탠다드 포함 파일은 Cg/HLSL 셰이더를 위해 제공된 것과 일치하고, .glslinc 확장자가 있을 뿐입니다.

UnityCG.glslinc

버텍스 셰이더 입력은 미리 정의된 GLSL 변수(gl_Vertex, gl_MultiTexCoord0, …)에서 비롯되거나, 사용자 정의 속성입니다. 일반적으로 탄젠트 벡터에만 사용자 정의 속성이 필요합니다.

attribute vec4 Tangent;

데이터는 varying 변수를 통해 버텍스 프로그램에서 프래그먼트 프로그램으로 전달됩니다. 예:

varying vec3 lightDir; // vertex shader computes this, fragment shader uses this

외부 OES 텍스처

Unity는 일부 프리프로세싱을 셰이더 컴파일 중에 수행합니다. 예를 들어 texture2D/texture2DProj 함수는 그래픽스 API(GlES3, GLCore)에 따라 texture/textureProj로 바뀔 수 있습니다. 일부 확장자는 GL_OES_EGL_image_external를 비롯한 새로운 규칙을 지원하지 않습니다.

GLSL 셰이더에서 외부 텍스처를 샘플링하려면 texture2D/texture2DProj 대신 textureExternal/textureProjExternal 호출을 사용해야 합니다.

예제:

gl_FragData[0] = textureExternal(_MainTex, uv);
여러 셰이더 프로그램 배리언트 만들기(Making multiple shader program variants)
Unity에서 사용하는 셰이딩 언어(Shading Language used in Unity)