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.
Checking the stable version of the documentation...
셰이더 소개
이 페이지에서는 셰이더가 무엇인지와 Godot에서 셰이더의 작동 방식에 대해 간략하게 설명합니다. 엔진의 셰이딩 언어에 대한 자세한 참조는 음영 언어를 참조하세요.
셰이더란 그래픽 처리 장치(GPU)에서 작동되는 특별한 종류의 프로그램입니다. 초기에 셰이더는 3D 씬의 그림자를 만들기 위해 만들어졌으나 요새는 더 많은 기술을 사용합니다. 당신은 셰이더를 통해 엔진에서 어떻게 지오메트리와 픽셀을 그릴지 조절할 수 있습니다.
Godot와 같은 최신 렌더링 엔진들은 셰이더를 통해 무엇이든 그릴 수 있습니다: 그래픽 카드는 수천개의 명령어를 동시에 처리할 수 있기 때문에 렌더링 속도가 빠릅니다.
그러나 병렬 특성으로 인해 셰이더는 일반적인 프로그램과 같은 방식으로 정보를 처리하지 않습니다. 셰이더 코드는 각 정점이나 픽셀에서 격리되어 실행됩니다. 프레임 간에도 데이터를 저장할 수 없습니다. 결과적으로 셰이더로 작업할 때는 다른 프로그래밍 언어와 다르게 코딩하고 생각해야 합니다.
텍스처의 모든 픽셀을 주어진 색상으로 업데이트하고 싶다고 가정합니다. GDScript에서 코드는 for 루프를 사용합니다:
for x in range(width):
for y in range(height):
set_color(x, y, some_color)
귀하의 코드는 이미 셰이더 루프의 일부이므로 해당 코드는 다음과 같습니다.
void fragment() {
COLOR = some_color;
}
참고
그래픽 카드는 그려야 하는 각 픽셀에 대해 fragment() 함수를 한 번 이상 호출합니다. 자세한 내용은 아래를 참조하세요.
Godot에서의 키프레임
Godot는 널리 사용되는 GLSL(OpenGL Shading Language)을 기반으로 하지만 단순화된 셰이딩 언어를 제공합니다. 엔진은 일부 하위 수준 초기화 작업을 처리하므로 복잡한 셰이더를 더 쉽게 작성할 수 있습니다.
Godot에서 셰이더는 "프로세서 기능"이라는 주요 기능으로 구성됩니다. 프로세서 기능은 셰이더의 프로그램 진입점입니다. 7가지의 서로 다른 프로세서 기능이 있습니다.
vertex()함수는 메시의 모든 정점에 대해 실행되며 해당 위치와 기타 정점별 변수를 설정합니다. canvas_item 셰이더 및 :ref:`spatial 셰이더 <doc_spatial_shader>`에서 사용됩니다.fragment()기능은 메시로 덮힌 모든 픽셀에 대해 실행됩니다. 정점 사이에 보간된vertex()함수의 출력 값을 사용합니다. canvas_item 셰이더 및 :ref:`spatial 셰이더 <doc_spatial_shader>`에서 사용됩니다.light()기능은 모든 픽셀과 모든 조명에 대해 실행됩니다.fragment()함수와 이전 실행에서 변수를 가져옵니다. canvas_item 셰이더 및 :ref:`spatial 셰이더 <doc_spatial_shader>`에서 사용됩니다.start()함수는 입자가 처음 생성될 때 입자 시스템의 모든 입자에 대해 한 번 실행됩니다. :ref:`입자 셰이더 <doc_particle_shader>`에 사용됩니다.process()기능은 각 프레임의 입자 시스템에 있는 모든 입자에 대해 실행됩니다. :ref:`입자 셰이더 <doc_particle_shader>`에 사용됩니다.sky()함수는 발광 큐브맵을 업데이트해야 할 때 발광 큐브맵의 모든 픽셀과 현재 화면의 모든 픽셀에 대해 실행됩니다. :ref:`sky 셰이더 <doc_sky_shader>`에서 사용됩니다.fog()함수는 :ref:`FogVolume <class_FogVolume>`과 교차하는 체적 안개 프록셀 버퍼의 모든 프록셀에 대해 실행됩니다. :ref:`fog 셰이더 <doc_fog_shader>`에서 사용됩니다.
경고
light() 기능은 vertex_lighting 렌더링 모드가 활성화되거나 프로젝트 설정에서 **렌더링 > 품질 > 음영 > 강제 정점 음영**이 활성화된 경우 실행되지 않습니다. 모바일 플랫폼에서는 기본적으로 활성화되어 있습니다.
참고
Godot는 또한 사용자가 완전히 맞춤형 GLSL 셰이더를 작성할 수 있는 API를 제공합니다. 자세한 내용은 :ref:`doc_compute_shaders`를 참조하세요.
플레이스 홀더 유형
모든 용도(2D, 3D, 입자, 하늘, 안개)에 대한 범용 구성을 제공하는 대신 작성 중인 셰이더 유형을 지정해야 합니다. 유형에 따라 다양한 렌더링 모드, 내장 변수 및 처리 기능이 지원됩니다.
Godot에서 모든 셰이더는 다음과 같이 첫 번째 줄에 유형을 지정해야 합니다:
shader_type spatial;
6 가지 패턴 유형이 있습니다:
:ref:`sky <doc_sky_shader>`는 :ref:`Skies <class_Sky>`를 렌더링합니다.
fog 렌더링 FogVolumes
렌더러 모드
셰이더에는 다음과 같이 셰이더 유형 뒤의 두 번째 줄에 지정할 수 있는 선택적 렌더링 모드가 있습니다.
shader_type spatial;
render_mode unshaded, cull_disabled;
렌더 모드는 Godot가 셰이더를 적용하는 방식을 변경합니다. 예를 들어, unshaded 모드는 엔진이 내장된 라이트 프로세서 기능을 건너뛰도록 합니다.
각 셰이더 유형에는 서로 다른 렌더링 모드가 있습니다. 렌더링 모드의 전체 목록은 각 셰이더 유형에 대한 참조를 참조하세요.
x.attribute
vertex() 처리 함수는 spatial 및 canvas_item 셰이더의 모든 정점에 대해 한 번씩 호출됩니다.
세계 기하학의 각 정점에는 위치 및 색상과 같은 속성이 있습니다. 함수는 해당 값을 수정하여 조각 함수에 전달합니다. 또한 이를 사용하여 가변을 사용하여 조각 함수에 추가 데이터를 보낼 수도 있습니다.
기본적으로 Godot는 기하학을 화면에 투영하는 데 필요한 정점 정보를 변환합니다. 렌더링 모드를 사용하여 데이터를 직접 변환할 수 있습니다. 예를 보려면 :ref:`Spatial 셰이더 doc <doc_spatial_shader>`을 참조하세요.
조각 프로세서
fragment() 처리 기능은 픽셀당 Godot 재료 매개변수를 설정하는 데 사용됩니다. 이 코드는 객체나 기본 요소가 그리는 모든 표시 픽셀에서 실행됩니다. spatial 및 canvas_item 셰이더에서만 사용할 수 있습니다.
조각 함수의 표준 사용은 조명을 계산하는 데 사용되는 재료 속성을 설정하는 것입니다. 예를 들어 ROUGHNESS, RIM 또는 ``TRANSMISSION``에 대한 값을 설정하면 조명 기능에 조명이 해당 조각에 어떻게 반응하는지 알려줍니다. 이를 통해 사용자가 많은 코드를 작성하지 않고도 복잡한 셰이딩 파이프라인을 제어할 수 있습니다. 이 내장 기능이 필요하지 않다면, 이를 무시하고 자신만의 조명 처리 기능을 작성하면 Godot가 이를 최적화할 것입니다. 예를 들어, ``RIM``에 값을 쓰지 않으면 Godot는 림 조명을 계산하지 않습니다. 컴파일하는 동안 Godot는 ``RIM``가 사용되는지 확인합니다; 그렇지 않은 경우 해당 코드를 모두 잘라냅니다. 따라서 사용하지 않는 효과에 대한 계산을 낭비하지 않습니다.
라이트 프로세서
light() 프로세서는 픽셀별로 실행되며 개체에 영향을 미치는 모든 조명에 대해 한 번 실행됩니다. 조명이 개체에 영향을 주지 않으면 실행되지 않습니다. 이는 fragment() 프로세서 내부에 호출되는 함수로 존재하며 일반적으로 fragment() 함수 내부에 설정된 재료 특성에 따라 작동합니다.
light() 프로세서는 2D에서 3D와 다르게 작동합니다. 각각의 작동 방식에 대한 설명은 해당 문서인 CanvasItem 셰이더 및 :ref:`Spatial 셰이더 <doc_spatial_shader>`을 참조하세요.