Unity에서는 HLSL 셰이더 프로그램뿐 아니라, 원시 GLSL(OpenGL 셰이딩 언어) 셰이더 프로그램도 작성할 수 있습니다. OpenGL Core 및 OpenGL ES 플랫폼에서만 지원됩니다.
참고: 이는 일반 워크플로의 일부로 권장하지 않으며 필요하지 않습니다. Unity는 필요할 때 HLSL을 최적화된 GLSL에 교차 컴파일합니다. 원시 GLSL은 테스트 또는 일부 특수 사용 사례에만 사용하는 것이 좋습니다.
GLSL 프로그램 스니핏은 GLSLPROGRAM 및 ENDGLSL 키워드 사이에 작성됩니다.
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
Unity는 셰이더 컴파일 중 일부 사전 처리 작업을 수행합니다. 예를 들어, 그래픽스 API(GlES3, GLCore)에 따라 texture2D/texture2DProj 함수가 texture/textureProj 함수로 대체될 수 있습니다. 일부 확장은 새로운 규칙, 특히 GL_OES_EGL_image_external을 지원하지 않습니다.
GLSL 셰이더에서 외부 텍스처를 샘플링하려면 texture2D/texture2DProj 대신 textureExternal/textureProjExternal 호출을 사용하십시오.
예:
gl_FragData[0] = textureExternal(_MainTex, uv);