Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

스프라이트를 2D 메시로 변환하기

이 문서는 Godot의 셰이딩 언어와 GLSL의 차이점을 설명하고 Shadertoy 및 The Book of 셰이더와 같은 다른 소스의 셰이더를 Godot 셰이더로 마이그레이션하는 방법에 대한 실용적인 조언을 제공합니다.

Godot의 셰이딩 언어에 대한 자세한 정보는 Shading Language 참조를 참조하세요.

GLSL

Godot는 몇 가지 품질 향상 기능을 추가하여 GLSL 기반의 셰이딩 언어를 사용합니다. 따라서 GLSL에서 사용할 수 있는 대부분의 기능은 Godot의 셰이딩 언어에서도 사용할 수 있습니다.

셰이더 프로그램

GLSL에서는 각 셰이더가 별도의 프로그램을 사용합니다. 정점 셰이더에 대한 프로그램 하나와 조각 셰이더에 대한 프로그램이 하나 있습니다. Godot에는 vertex 및/또는 fragment 기능을 포함하는 단일 셰이더가 있습니다. 하나만 작성하기로 선택하면 Godot가 다른 하나를 제공할 것입니다.

Godot는 하나의 파일에 조각과 정점 셰이더를 정의하여 균일한 변수와 함수를 공유할 수 있도록 합니다. GLSL에서 정점 및 조각 프로그램은 가변 변수가 사용되는 경우를 제외하고는 변수를 공유할 수 없습니다.

x.attribute

GLSL에서는 속성을 사용하여 정점별 정보를 전달할 수 있으며 원하는 만큼 전달할 수 있는 유연성을 갖습니다. Godot에는 VERTEX``(위치), ``COLOR, UV, UV2, ``NORMAL``를 포함하여 설정된 수의 입력 속성이 있습니다. 문서의 셰이더 참조 섹션에 있는 각 셰이더' 페이지에는 정점 속성의 전체 목록이 함께 제공됩니다.

gl_Position

``gl_Position``는 정점 셰이더에 지정된 정점의 최종 위치를 받습니다. 클립 공간에서 사용자가 지정합니다. 일반적으로 GLSL에서 모델 공간 정점 위치는 ``position``라는 정점 속성을 사용하여 전달되며 모델 공간에서 클립 공간으로의 변환을 수동으로 처리합니다.

Godot에서 VERTEX``는 ``vertex 함수 시작 부분에서 모델 공간의 정점 위치를 지정합니다. Godot는 또한 사용자 정의 vertex 함수가 실행된 후 클립 공간으로의 최종 변환을 처리합니다. 모델에서 뷰 공간으로의 변환을 건너뛰려면 ``render_mode``를 ``skip_vertex_transform``로 설정할 수 있습니다. 모든 변환을 건너뛰려면 ``render_mode``를 ``skip_vertex_transform``로 설정하고 ``PROJECTION_MATRIX``를 ``mat4(1.0)``로 설정하여 뷰 공간에서 클립 공간으로의 최종 변환을 무효화하세요.

변화

가변은 정점 셰이더에서 조각 셰이더로 전달될 수 있는 변수 유형입니다. 최신 GLSL(3.0 이상)에서 가변은 inout 키워드로 정의됩니다. 정점 셰이더 밖으로 나가는 변수는 정점 셰이더에서는 ``out``로, 조각 셰이더 내부에서는 ``in``로 정의됩니다.

메인

GLSL에서 각 셰이더 프로그램은 독립적인 C 스타일 프로그램처럼 보입니다. 따라서 주요 진입점은 ``main``입니다. 정점 셰이더를 복사하는 경우 ``main``의 이름을 ``vertex``로 바꾸고 조각 셰이더를 복사하는 경우 ``main``의 이름을 ``fragment``로 바꿉니다.

매크로

:ref:`Godot shader preprocessor<doc_shader_preprocessor>`는 다음 매크로를 지원합니다.

  • #define / #undef

  • #if, #elif, #else, #endif, defined(), #ifdef, #ifndef

  • #include``(.gdshaderinc`` 파일만 해당, 최대 깊이는 25)

  • #pragma disable_preprocessor, 파일의 나머지 부분에 대한 전처리를 비활성화합니다.

변수

GLSL에는 하드 코딩된 많은 내장 변수가 있습니다. 이러한 변수는 균일하지 않으므로 기본 프로그램에서 편집할 수 없습니다.

변수

유형

동등한

설명

gl_FragColor

아웃 vec4

색상

각 픽셀의 출력 색상입니다.

gl_FragCoord

vec4

프래그코트

전체 화면 사변형에 대한 것입니다. 더 작은 사변형에 대해서는, UV를 사용하세요.

gl_Position

vec4

버텍스

버텍스의 위치, 버텍스 셰이더에서 출력.

gl_PointSize

float

POINT_SIZE

점 프리미티브의 크기.

gl_PointCoord

vec2

POINT_COORD

점 프리미티브를 그릴 때 점의 위치.

gl_FrontFacing

bool

FRONT_FACING

프리미티브의 앞면이면 True입니다.

좌표

GLSL의 ``gl_FragCoord``와 Godot 셰이딩 언어의 ``FRAGCOORD``는 동일한 좌표계를 사용합니다. Godot에서 UV를 사용하면 y좌표가 거꾸로 뒤집힐 것입니다.

정밀도

GLSL에서는 precision 키워드를 사용하여 셰이더 상단에서 지정된 유형(float 또는 int)의 정밀도를 정의할 수 있습니다. Godot에서는 변수를 정의할 때 유형 앞에 정밀도 한정자 lowp, mediump``highp``를 배치하여 필요에 따라 개별 변수의 정밀도를 설정할 수 있습니다. 자세한 내용은 Shading Language 참조를 확인하세요.

셰이더토이

`Shadertoy <https://www.shadertoy.com/results?query=&sort=popular&from=10&num=4>`_은 조각 셰이더를 쉽게 작성하고 `순수 마법 <https://www.shadertoy.com/view/4tjGRh>`_을 생성할 수 있게 해주는 웹사이트입니다.

Shadertoy는 사용자에게 셰이더에 대한 모든 권한을 부여하지 않습니다. 모든 입력과 유니폼을 처리하며 사용자가 셰이더 조각만 작성할 수 있도록 합니다.

타입(Types)

Shadertoy는 webgl 사양을 사용하므로 약간 다른 버전의 GLSL을 실행합니다. 그러나 상수와 매크로를 포함한 일반 유형은 여전히 존재합니다.

메인 이미지(mainImage)

Shadertoy 셰이더에 대한 주요 진입점은 mainImage 기능입니다. mainImage``에는 ``fragColor``와 ``fragCoord``라는 개의 매개변수가 있는데, 이는 각각 Godot의 ``COLORFRAGCOORD``에 해당합니다. 매개변수는 Godot에서 자동으로 처리되므로 직접 매개변수로 포함할 필요가 없습니다. ``mainImage 함수에 있는 모든 것은 Godot로 포팅할 때 fragment 함수에 복사되어야 합니다.

변수

조각 셰이더를 간단하고 쉽게 작성하기 위해 Shadertoy는 기본 프로그램에서 조각 셰이더로 많은 유용한 정보를 전달하는 작업을 처리합니다. 이들 중 일부는 Godot에서 기본적으로 사용할 수 없도록 선택했기 때문에 Godot에 동등한 기능이 없습니다. Godot에서는 자신만의 유니폼을 만들 수 있는 능력을 제공하기 때문에 괜찮습니다. 해당 항목이 "유니폼 제공"으로 나열된 변수의 경우 사용자는 해당 유니폼을 직접 생성할 책임이 있습니다. 설명은 독자에게 대체물로 전달할 수 있는 내용에 대한 힌트를 제공합니다.

변수

유형

동등한

설명

fragColor

아웃 vec4

색상

각 픽셀의 출력 색상입니다.

조각좌표

vec2

FRAGCOORD.xy

전체 화면 사변형에 대한 것입니다. 더 작은 사변형에 대해서는, UV를 사용하세요.

아이레졸루션

vec3

1.0 / SCREEN_PIXEL_SIZE

수동으로 전달할 수도 있습니다.

아이타임

float

시간

셰이더가 시작된 이후의 시간입니다.

아이타임델타

float

유니폼 제공

이전 프레임을 렌더링하는 시간입니다.

아이프레임

float

유니폼 제공

프레임 번호.

iChannelTime[4]

float

유니폼 제공

특정 텍스처가 시작된 이후의 시간입니다.

아이마우스

vec4

유니폼 제공

픽셀 좌표의 마우스 위치입니다.

iDate

vec4

유니폼 제공

현재 날짜(초 단위로 표시)

iChannelResolution[4]

vec3

1.0 / TEXTURE_PIXEL_SIZE

특정 질감의 해상도.

아이채널리

샘플러2D

질감

Godot는 단 하나의 내장 기능만 제공합니다. 사용자는 더 많은 것을 만들 수 있습니다.

좌표

fragCoord``는 :ref:`GLSL <glsl_coordinates>`의 ``gl_FragCoord 및 Godot의 ``FRAGCOORD``와 동일하게 작동합니다.

셰이더의 책

Shadertoy와 마찬가지로 `The Book of 셰이더 <https://thebookofshaders.com>`_는 사용자가 상호 작용할 수 있는 웹 브라우저의 조각 셰이더에 대한 액세스를 제공합니다. 사용자는 유니폼 세트 목록이 전달되고 추가 유니폼을 추가할 수 없는 조각 셰이더 코드를 작성하도록 제한됩니다.

일반적으로 셰이더를 다양한 프레임워크로 포팅하는 데 대한 추가 도움말을 보려면 셰이더 책에서 다양한 프레임워크에서 셰이더 실행에 대한 `page <https://thebookofshaders.com/04>`_을 제공합니다.

타입(Types)

셰이더의 책은 webgl 사양을 사용하므로 약간 다른 버전의 GLSL을 실행합니다. 그러나 상수와 매크로를 포함한 일반 유형은 여전히 존재합니다.

메인

셰이더 조각 셰이더 책의 진입점은 GLSL과 마찬가지로 main``입니다. 셰이더 ``main 함수 책에 쓰여진 모든 내용은 Godot의 fragment 함수에 복사되어야 합니다.

변수

셰이더 책은 Shadertoy보다 일반 GLSL에 더 가깝습니다. 또한 Shadertoy보다 더 적은 수의 유니폼을 구현합니다.

변수

유형

동등한

설명

gl_FragColor

아웃 vec4

색상

각 픽셀의 출력 색상입니다.

gl_FragCoord

vec4

프래그코트

전체 화면 사변형에 대한 것입니다. 더 작은 사변형에 대해서는, UV를 사용하세요.

u_resolution

vec2

1.0 / SCREEN_PIXEL_SIZE

수동으로 전달할 수도 있습니다.

u_time

float

시간

셰이더가 시작된 이후의 시간입니다.

u_mouse

vec2

유니폼 제공

픽셀 좌표의 마우스 위치입니다.

좌표

셰이더의 책은 :ref:`GLSL <glsl_coordinates>`과 동일한 좌표계를 사용합니다.