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...
셰이더
Sky 셰이더는 하늘 배경을 그리고 이미지 기반 조명(IBL)에 사용되는 래디언스 큐브맵을 업데이트하는 데 사용되는 특별한 유형의 셰이더입니다. Sky 셰이더에는 sky() 기능이라는 하나의 처리 기능만 있습니다.
두 장소에서 템플릿을 관리할 수 있습니다.
먼저 하늘 셰이더는 씬에서 하늘을 배경으로 사용하도록 선택한 경우 하늘을 그리는 데 사용됩니다.
둘째, 하늘 셰이더는 주변 색상이나 반사에 하늘을 사용할 때 래디언스 큐브맵을 업데이트하는 데 사용됩니다.
셋째, 하늘 셰이더는 고해상도 배경이나 큐브맵 패스에 사용할 수 있는 저해상도 서브패스를 그리는 데 사용됩니다.
전체적으로 이는 하늘 셰이더가 프레임당 최대 6번 실행될 수 있음을 의미하지만 실제로는 래디언스 큐브맵을 프레임마다 업데이트할 필요가 없고 모든 하위 패스가 사용되지 않기 때문에 그보다 훨씬 적습니다. AT_*_PASS 부울을 확인하여 호출되는 위치에 따라 셰이더의 동작을 변경할 수 있습니다. 예를 들면:
shader_type sky;
void sky() {
if (AT_CUBEMAP_PASS) {
// Sets the radiance cubemap to a nice shade of blue instead of doing
// expensive sky calculations
COLOR = vec3(0.2, 0.6, 1.0);
} else {
// Do expensive sky calculations for background sky only
COLOR = get_sky_color(EYEDIR);
}
}
하늘 셰이더를 사용하여 배경을 그리는 경우 화면에서 가려지지 않은 모든 조각에 대해 셰이더가 호출됩니다. 그러나 배경의 하위 패스의 경우 셰이더는 하위 패스의 모든 픽셀에 대해 호출됩니다.
하늘 셰이더를 사용하여 발광 큐브맵을 업데이트하는 경우 하늘 셰이더는 큐브맵의 모든 픽셀에 대해 호출됩니다. 반면, 셰이더는 래디언스 큐브맵을 업데이트해야 할 때만 호출됩니다. 셰이더 매개변수가 업데이트되면 래디언스 큐브맵도 업데이트되어야 합니다. 예를 들어 ``TIME``가 셰이더에 사용되면 래디언스 큐브맵은 모든 프레임을 업데이트합니다. 다음 변경 사항 목록은 래디언스 큐브맵을 강제로 업데이트합니다.
``TIME``가 사용됩니다.
``POSITION``를 사용하며 카메라 위치가 변경됩니다.
LIGHTX_*속성이 사용되고 :ref:`DirectionalLight3D <class_DirectionalLight3D>`이 변경되는 경우.셰이더에서 유니폼이 변경된 경우.
화면의 크기가 조정되고 하위 패스 중 하나가 사용되는 경우.
불필요하게 래디언스 큐브맵을 업데이트하지 않도록 하세요. 각 프레임마다 래디언스 큐브맵을 업데이트해야 하는 경우 :ref:`Sky 프로세스 모드 <class_Sky_property_process_mode>`가 :ref:`PROCESS_MODE_REALTIME <class_Sky_constant_PROCESS_MODE_REALTIME>`으로 설정되어 있는지 확인하세요.
:ref:`process mode <class_Sky_property_process_mode>`는 발광 큐브맵의 렌더링에만 영향을 미칩니다. 보이는 하늘은 항상 모든 픽셀에 대해 조각 셰이더를 호출하여 렌더링됩니다. 복잡한 조각 셰이더를 사용하면 렌더링 오버헤드가 높아질 수 있습니다. 하늘이 정적이거나(위에 나열된 조건이 충족됨) 천천히 변하는 경우 매 프레임마다 전체 조각 셰이더를 실행할 필요가 없습니다. 이는 전체 하늘을 래디언스 큐브맵으로 렌더링하고 보이는 하늘을 렌더링할 때 이 큐브맵에서 읽으면 피할 수 있습니다. 완전히 정적인 하늘의 경우 이는 한 번만 렌더링하면 된다는 의미입니다.
다음 코드는 전체 하늘을 래디언스 큐브맵으로 렌더링하고 눈에 보이는 하늘을 표시하기 위해 해당 큐브맵에서 읽습니다.
shader_type sky;
void sky() {
if (AT_CUBEMAP_PASS) {
vec3 dir = EYEDIR;
vec4 col = vec4(0.0);
// Complex color calculation
COLOR = col.xyz;
ALPHA = 1.0;
} else {
COLOR = texture(RADIANCE, EYEDIR).rgb;
}
}
이런 식으로 복잡한 계산은 큐브맵 패스에서만 발생하며, 성능과 시각적 충실도 사이에서 원하는 균형을 얻기 위해 하늘의 process mode 및 :ref:`radiance size <class_Sky_property_radiance_size>`를 설정하여 최적화할 수 있습니다.
렌더러 모드
서브패스를 사용하면 더 낮은 해상도에서 더 많은 비용이 드는 계산을 수행하여 셰이더 속도를 높일 수 있습니다. 예를 들어 다음 코드는 하늘의 나머지 부분보다 낮은 해상도로 구름을 렌더링합니다.
shader_type sky;
render_mode use_half_res_pass;
void sky() {
if (AT_HALF_RES_PASS) {
// Run cloud calculation for 1/4 of the pixels
vec4 color = generate_clouds(EYEDIR);
COLOR = color.rgb;
ALPHA = color.a;
} else {
// At full resolution pass, blend sky and clouds together
vec3 color = generate_sky(EYEDIR);
COLOR = color + HALF_RES_COLOR.rgb * HALF_RES_COLOR.a;
}
}
렌더링 모드 |
설명 |
|---|---|
use_half_res_pass |
셰이더가 절반 해상도 패스에 쓰고 액세스할 수 있도록 허용합니다. |
use_quarter_res_pass |
셰이더가 1/4 해상도 패스에 쓰고 액세스할 수 있도록 허용합니다. |
스타일 |
사용하면 안개가 하늘에 영향을 주지 않습니다. |
Built-In(내장)
``in``로 표시된 값은 읽기 전용입니다. ``out``로 표시된 값은 선택적으로 쓸 수 있으며 반드시 합리적인 값을 포함하지는 않습니다. 샘플러는 기록할 수 없으므로 표시되지 않습니다.
벡터 내장 타입
전역 내장 기능은 사용자 정의 기능을 포함하여 어디에서나 사용할 수 있습니다.
LIGHT0, LIGHT1, LIGHT2 및 LIGHT3``로 액세스되는 4개의 ``LIGHTX 조명이 있습니다.
내장 |
설명 |
|---|---|
부동 소수점 TIME |
엔진이 시작된 이후의 전역 시간(초)입니다. |
vec3 **위치**에서 |
월드 공간에서의 카메라 위치. |
샘플러큐브 래디언스 |
래디언스 큐브맵. 백그라운드 패스 중에만 읽을 수 있습니다. 사용하기 전에 ``!AT_CUBEMAP_PASS``를 확인하십시오. |
bool **AT_HALF_RES_PASS**에서 |
절반 해상도 패스로 렌더링할 때 |
bool AT_QUARTER_RES_PASS |
1/4 해상도 패스로 렌더링할 때 |
bool **AT_CUBEMAP_PASS**에서 |
래디언스 큐브맵으로 렌더링할 때 |
부울 LIGHTX_ENABLED |
``LIGHTX``가 표시되고 씬에 있는 경우 ``true``입니다. ``false``인 경우 다른 조명 속성은 가비지일 수 있습니다. |
부동 LIGHTX_ENERGY |
``LIGHTX``의 에너지 승수. |
vec3 LIGHTX_DIRECTION |
``LIGHTX``가 향하고 있는 방향입니다. |
vec3 **LIGHTX_COLOR**에서 |
``LIGHTX``의 색상입니다. |
부동 LIGHTX_SIZE |
하늘에서 ``LIGHTX``의 각도 직경입니다. 라디안으로 표현됩니다. 참고로 지구에서 태양은 약 .0087라디안(0.5도)입니다. |
부동 소수점 PI |
|
부동 TAU |
|
부동 E |
|
Built-In(내장)
내장 |
설명 |
|---|---|
vec3에서 EYEDIR |
현재 픽셀의 정규화된 방향입니다. 이것을 절차적 효과의 기본 방향으로 사용하십시오. |
vec2에서 SCREEN_UV |
현재 픽셀의 스크린 UV 좌표입니다. 텍스처를 전체 화면에 매핑하는 데 사용됩니다. |
vec2 **SKY_COORDS**에서 |
구형 UV. 파노라마 텍스처를 하늘에 매핑하는 데 사용됩니다. |
vec4에서 HALF_RES_COLOR |
절반 해상도 패스에서 해당 픽셀의 색상 값입니다. 선형 필터를 사용합니다. |
vec4에서 QUARTER_RES_COLOR |
1/4 해상도 패스에서 해당 픽셀의 색상 값입니다. 선형 필터를 사용합니다. |
out vec3 컬러 |
출력 로그 |
아웃 플로트 알파 |
출력 알파 값은 하위 패스에서만 사용할 수 있습니다. |
out vec4 FOG |