Version: Unity 6.0 (6000.0)
언어 : 한국어
HLSL에서 셰이더 컴파일러에 정보 전달
GPU에서 렌더 상태 설정

Unity의 GLSL

Unity에서는 HLSL 셰이더 프로그램뿐 아니라, 원시 GLSL(OpenGL 셰이딩 언어) 셰이더 프로그램도 작성할 수 있습니다. OpenGL Core 및 OpenGL ES 플랫폼에서만 지원됩니다.

참고: 이는 일반 워크플로의 일부로 권장하지 않으며 필요하지 않습니다. Unity는 필요할 때 HLSL을 최적화된 GLSL에 교차 컴파일합니다. 원시 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는 셰이더 컴파일 중 일부 사전 처리 작업을 수행합니다. 예를 들어, 그래픽스 API(GlES3, GLCore)에 따라 texture2D/texture2DProj 함수가 texture/textureProj 함수로 대체될 수 있습니다. 일부 확장은 새로운 규칙, 특히 GL_OES_EGL_image_external을 지원하지 않습니다.

GLSL 셰이더에서 외부 텍스처를 샘플링하려면 texture2D/texture2DProj 대신 textureExternal/textureProjExternal 호출을 사용하십시오.

예:

gl_FragData[0] = textureExternal(_MainTex, uv);
HLSL에서 셰이더 컴파일러에 정보 전달
GPU에서 렌더 상태 설정