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...
공간 셰이더
공간 셰이더는 3D 개체를 음영 처리하는 데 사용됩니다. 이는 셰이더 Godot가 제공하는 가장 복잡한 유형입니다. 공간 셰이더는 다양한 렌더링 모드와 다양한 렌더링 옵션(예: 하위 표면 산란, 전송, 주변 폐색, 림 조명 등)으로 고도로 구성 가능합니다. 사용자는 선택적으로 정점, 조각 및 조명 프로세서 기능을 작성하여 객체가 그려지는 방식에 영향을 줄 수 있습니다.
렌더러 모드
렌더링 모드 |
설명 |
|---|---|
블렌드_믹스 |
혼합 혼합 모드(알파는 투명도), 기본값. |
블렌드_추가 |
덧셈 블렌드 모드. |
blend_sub |
빼기 블렌드 모드. |
blend_mul |
곱셈 블렌드 모드. |
blend_premul_alpha |
미리 곱셈된 알파 블렌드 모드(완전 투명 = 추가, 완전 불투명 = 혼합). |
깊이_그리기_불투명 |
불투명한 형상(투명하지 않음)에 대해서만 깊이를 그립니다. |
깊이_그리기_항상 |
항상 깊이를 그립니다(불투명 및 투명). |
깊이_그리기_절대로 |
절대 깊이를 그리지 마세요. |
깊이_프리패스_알파 |
투명한 기하구조에 대해 불투명 깊이 사전 통과를 수행합니다. |
깊이_테스트_비활성화됨 |
깊이 테스트를 비활성화합니다. |
깊이_테스트_기본 |
깊이 테스트에서는 해당 픽셀이 다른 픽셀 뒤에 있으면 해당 픽셀을 삭제합니다. Forward+에서만 해당 픽셀이 다른 픽셀과 정확히 동일한 깊이에 있는 경우 해당 픽셀도 삭제됩니다. |
깊이_테스트_반전 |
깊이 테스트에서는 픽셀이 다른 픽셀 앞에 있으면 해당 픽셀을 삭제합니다. 스텐실 효과에 유용합니다. |
sss_mode_skin |
피부를 위한 하위 표면 산란 모드(예: 빨간색 채널 강화 등 인간 피부의 시각적 요소 최적화) |
컬백 |
뒷면을 발췌합니다(기본값). |
컬프론트 |
앞면을 컬링합니다. |
추출_비활성화됨 |
컬링이 비활성화되었습니다(양면). |
음영되지 않음 |
결과는 알베도입니다. 머티리얼에서는 조명/음영이 발생하지 않으므로 렌더링 속도가 빨라집니다. |
와이어프레임 |
Geometry draws using lines (useful for troubleshooting).
When using the Compatibility renderer, you must call
|
debug_shadow_splits |
방향성 그림자는 각 분할에 대해 서로 다른 색상을 사용하여 그려집니다(문제 해결에 유용함). |
확산_벌리 |
확산을 위한 Burley(Disney PBS)(기본값). |
확산_램버트 |
확산을 위한 램버트 쉐이딩. |
확산_램버트_랩 |
확산을 위한 램버트 랩 셰이딩(거칠기에 따라 다름) |
diffuse_toon |
확산을 위한 툰 셰이딩. |
specular_schlick_ggx |
직접광 반사 로브용 Schlick-GGX(기본값) |
specular_toon |
직사광 반사 로브용 툰입니다. |
반사_비활성화됨 |
직접광 반사 로브를 비활성화합니다. 반사광에 영향을 주지 않습니다(대신 |
skip_vertex_transform |
|
world_vertex_coords |
|
보너스_올바른_정상 |
불균일 스케일이 메시에 적용될 때 사용합니다 (참고: 현재 구현되지 않음). |
shadows_disabled |
셰이더에서 컴퓨팅 섀도우를 비활성화합니다. 셰이더는 그림자를 수신하지 않지만 여전히 그림자를 드리울 수 있습니다. |
ambient_light_disabled |
주변광 및 래디언스 맵의 기여를 비활성화합니다. |
shadow_to_opacity |
조명은 알파를 수정하여 그림자가 있는 영역은 불투명하고 그림자가 없는 영역은 투명하게 만듭니다. AR의 카메라 피드에 그림자를 오버레이하는 데 유용합니다. |
정점_조명 |
픽셀당 조명 대신 정점 기반 조명을 사용합니다. |
particle_trails |
입자 형상에 사용될 때 트레일을 활성화합니다. |
alpha_to_coverage |
|
alpha_to_coverage_and_one |
|
스타일 |
깊이 기반 또는 체적 안개 수신을 비활성화합니다. 입자와 같은 |
블렌드 모드
참고
스텐실 지원은 실험적이므로 사용에 따른 책임은 사용자 본인에게 있습니다. 호환성을 최대한 깨지지 않도록 노력하겠지만, API에 중대한 결함이 발견될 경우 다음 마이너 버전에서 변경될 수 있습니다.
스텐실 작업은 하드웨어 가속 방식으로 효율적인 버퍼에 쓸 수 있는 작업 집합입니다. 이는 일반적으로 씬의 일부를 마스킹하거나 마스킹하는 데 사용됩니다.
가장 잘 알려진 용도는 다음과 같습니다.
윤곽선: 내부 윤곽선을 피하기 위해 윤곽선을 그리는 내부 메쉬를 마스크합니다.
X-Ray: 다른 개체 뒤에 메시를 표시합니다.
포털: 객체를 마스킹하여 일반적으로 "불가능한"(유클리드가 아닌) 형상을 그립니다.
참고
투명 패스의 스텐실 버퍼에서만 읽을 수 있습니다. 불투명 패스를 읽으려는 시도는 현재 지원되지 않는 동작이므로 실패합니다.
합성기 효과의 경우 기본 렌더러의 스텐실 버퍼를 사용자 정의 텍스처에 복사할 수 없습니다.
스케일링 모드 |
설명 |
|---|---|
정적 함수 |
스텐실 버퍼에서 읽습니다. |
쓰기 |
스텐실 버퍼에 참조 값을 씁니다. |
write_if_length_fail |
깊이 테스트가 실패하면 스텐실 버퍼에 참조 값을 씁니다. |
비교_항상 |
항상 스텐실 테스트를 통과하세요. |
비교_동등 |
참조 값이 스텐실 버퍼 값과 같으면 스텐실 테스트를 통과합니다. |
비교하지_같지 않음 |
참조 값이 스텐실 버퍼 값과 같지 않으면 스텐실 테스트를 통과합니다. |
텍스처 압축: |
참조 값이 스텐실 버퍼 값보다 작은 경우 스텐실 테스트를 통과합니다. |
비교가 적거나 같음 |
참조 값이 스텐실 버퍼 값보다 작거나 같으면 스텐실 테스트를 통과합니다. |
비교_더욱 |
참조 값이 스텐실 버퍼 값보다 큰 경우 스텐실 테스트를 통과합니다. |
비교_더 크거나_같음 |
참조 값이 스텐실 버퍼 값보다 크거나 같으면 스텐실 테스트를 통과합니다. |
Built-In(내장)
``in``로 표시된 값은 읽기 전용입니다. ``out``로 표시된 값은 선택적으로 쓸 수 있으며 반드시 합리적인 값을 포함하지는 않습니다. ``inout``로 표시된 값은 적절한 기본값을 제공하며 선택적으로 쓸 수 있습니다. 샘플러는 기록할 수 없으므로 표시되지 않습니다.
모든 내장 기능을 모든 처리 기능에서 사용할 수 있는 것은 아닙니다. fragment() 함수에서 내장된 정점에 액세스하려면 varying <doc_shading_언어_varyings>`을 사용할 수 있습니다. ``light()` 함수에서 내장된 조각에 액세스하는 경우에도 동일하게 적용됩니다.
벡터 내장 타입
사용자 정의 기능을 포함하여 전역 내장 기능을 어디에서나 사용할 수 있습니다.
내장 |
설명 |
|---|---|
부동 소수점 TIME |
엔진이 시작된 이후의 전역 시간(초)입니다. |
부동 소수점 PI |
|
부동 TAU |
|
부동 E |
|
bool **OUTPUT_IS_SRGB**에서 |
출력이 sRGB 색상 공간인 경우 ``true``입니다(호환성 렌더러에서는 ``true``이고 Forward+ 및 Mobile에서는 ``false``입니다). |
부동 CLIP_SPACE_FAR |
클립 공간 |
in bool IS_MULTIVIEW |
|
in bool IN_SHADOW_PASS |
|
벡터 내장 타입
정점 데이터(VERTEX, NORMAL, TANGENT 및 BITANGENT)는 모델 공간(로컬 공간이라고도 함)에 표시됩니다. 기록되지 않으면 이러한 값은 수정되지 않고 전달된 대로 전달된 다음 ``fragment()``에서 사용할 뷰 공간으로 변환됩니다.
world_vertex_coords 렌더링 모드를 사용하여 월드 공간에 선택적으로 표시할 수 있습니다.
사용자는 내장된 modelview 변환을 비활성화하고(프로젝션은 나중에 계속 발생함) 다음 코드를 사용하여 수동으로 수행할 수 있습니다.
shader_type spatial;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
BINORMAL = normalize((MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz);
TANGENT = normalize((MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz);
}
UV, UV2 및 COLOR``와 같은 다른 내장 기능도 수정되지 않으면 ``fragment() 함수로 전달됩니다.
사용자는 내장된 ``POSITION``를 사용하여 모델 뷰 및 투영 변환을 재정의할 수 있습니다. ``POSITION``를 셰이더의 아무 곳에나 쓰면 항상 사용되므로 항상 허용 가능한 값을 갖도록 보장할 책임은 사용자에게 있습니다. ``POSITION``를 사용하는 경우 ``VERTEX``의 값은 무시되고 투영이 발생하지 않습니다. 그러나 셰이더 조각에 전달된 값은 여전히 ``VERTEX``에서 나옵니다.
인스턴스화의 경우 INSTANCE_CUSTOM 변수에는 인스턴스 사용자 정의 데이터가 포함됩니다. 입자를 사용할 때 이 정보는 일반적으로 다음과 같습니다.
x: 라디안 단위의 회전 각도입니다.
y: 수명 동안의 단계(
0.0``~``1.0).z: 애니메이션 프레임.
이를 통해 기본 입자 재질을 사용하여 셰이더를 입자 시스템에 쉽게 조정할 수 있습니다. 사용자 정의 입자 셰이더를 작성할 때 이 값을 원하는 대로 사용할 수 있습니다.
내장 |
설명 |
|---|---|
vec2 **VIEWPORT_SIZE**에서 |
뷰포트의 크기(픽셀 단위)입니다. |
mat4 VIEW_MATRIX |
공간 변화를 볼 수 있는 세계 공간. |
mat4 INV_VIEW_MATRIX |
보기 공간을 월드 공간으로 변환합니다. |
mat4 MAIN_CAM_INV_VIEW_MATRIX |
현재 뷰포트를 그리는 데 사용되는 카메라의 보기 공간을 월드 공간으로 변환합니다. |
mat4 INV_PROJECTION_MATRIX |
공간 변환을 보려면 공간을 클립하세요. |
vec3 **NODE_POSITION_WORLD**에서 |
노드 위치, 월드 공간. |
vec3 **NODE_POSITION_VIEW**에서 |
노드 위치, 뷰 공간. |
vec3 **CAMERA_POSITION_WORLD**에서 |
월드 공간에서의 카메라 위치. 다중 뷰/스테레오 렌더링 시 두 눈의 중간점을 나타냅니다. |
vec3 **CAMERA_DIRECTION_WORLD**에서 |
월드 공간에서의 카메라 방향. |
단위 CAMERA_VISIBLE_LAYERS |
현재 패스를 렌더링하는 카메라의 레이어를 컬링합니다. |
int INSTANCE_ID |
인스턴스화를 위한 인스턴스 ID입니다. |
vec4 **INSTANCE_CUSTOM**에서 |
인스턴스 사용자 정의 데이터(주로 입자용) |
int VIEW_INDEX |
우리가 렌더링하고 있는 뷰입니다. 모노(다중 뷰 아님) 또는 왼쪽 눈의 경우 |
int VIEW_MONO_LEFT |
모노 또는 왼쪽 눈에 대한 상수이며 항상 ``0``입니다. |
int VIEW_RIGHT |
오른쪽 눈에 대한 상수, 항상 |
vec3에서 EYE_OFFSET |
뷰 공간에서 렌더링되는 눈의 위치 오프셋입니다. 멀티뷰 렌더링에만 적용 가능합니다. |
inout vec3 VERTEX |
모형 공간에서 꼭지점의 위치입니다. ``world_vertex_coords``를 사용하는 경우 월드 공간에서. |
int VERTEX_ID |
정점 버퍼에 있는 현재 정점의 인덱스입니다. |
inout vec3 정상 |
모형 공간에서는 정상입니다. ``world_vertex_coords``를 사용하는 경우 월드 공간에서. |
inout vec3 탄젠트 |
모형 공간의 접선. ``world_vertex_coords``를 사용하는 경우 월드 공간에서. |
inout vec3 바이노멀 |
모형 공간의 종법선. ``world_vertex_coords``를 사용하는 경우 월드 공간에서. |
out vec4 포지션 |
If written to on any branch, overrides final vertex position in clip space. |
inout vec2 UV |
UV 메인 채널. |
입력 vec2 UV2 |
UV 보조 채널. |
inout vec4 색상 |
정점의 색상. 각 채널에 대해 |
아웃 플로트 거칠기 |
정점 조명의 거칠기. |
부동 소수점 POINT_SIZE |
포인트 렌더링을 위한 포인트 크기입니다. |
inout mat4 MODELVIEW_MATRIX |
공간 변환을 보기 위한 모델/로컬 공간(가능한 경우 사용) |
inout mat3 MODELVIEW_NORMAL_MATRIX |
|
mat4 MODEL_MATRIX |
모델/로컬 공간을 월드 공간으로 변환합니다. |
mat3 MODEL_NORMAL_MATRIX |
|
inout mat4 PROJECTION_MATRIX |
보기 공간을 클립 공간으로 변환합니다. |
uvec4 BONE_INDICES |
|
vec4 BONE_WEIGHTS |
|
vec4 **CUSTOM0**에서 |
정점 기본 요소의 사용자 정의 값입니다. 추가 UV를 사용하는 경우 ``xy``는 UV3이고 ``zw``는 UV4입니다. |
vec4에서 커스텀1 |
정점 기본 요소의 사용자 정의 값입니다. 추가 UV를 사용하는 경우 ``xy``는 UV5이고 ``zw``는 UV6입니다. |
vec4 **CUSTOM2**에서 |
정점 기본 요소의 사용자 정의 값입니다. 추가 UV를 사용하는 경우 ``xy``는 UV7이고 ``zw``는 UV8입니다. |
vec4에서 커스텀3 |
정점 기본 요소의 사용자 정의 값입니다. |
부동 소수점 Z_CLIP_SCALE |
If written to on any branch, scales the vertex towards
the camera to avoid clipping into things like walls.
Lighting and shadows will continue to work correctly
when this is written to, but screen-space effects like
SSAO and SSR may break with lower scales. Try to keep
this value as close to |
참고
MODELVIEW_MATRIX``는 ``MODEL_MATRIX``와 ``VIEW_MATRIX``를 모두 결합하며 부동 소수점 문제가 발생할 수 있는 경우에 더 적합합니다. 예를 들어, 객체가 세계 원점에서 매우 멀리 떨어져 있는 경우 분리된 ``MODEL_MATRIX 및 ``VIEW_MATRIX``를 사용할 때 부동 소수점 문제가 발생할 수 있습니다.
프래그먼트 내장
Godot 조각 프로세서 기능의 기본 사용은 개체의 재료 속성을 설정하고 내장 렌더러가 최종 음영 처리를 처리하도록 하는 것입니다. 그러나 이러한 속성을 모두 사용할 필요는 없으며, 속성을 작성하지 않으면 Godot는 해당 기능을 최적화합니다.
내장 |
설명 |
|---|---|
vec2 **VIEWPORT_SIZE**에서 |
뷰포트의 크기(픽셀 단위)입니다. |
vec4에서 FRAGCOORD |
Coordinate of pixel center in screen space. |
부울 FRONT_FACING |
현재 면이 정면을 향하고 있으면 |
vec3에서 보기 |
조각 위치에서 카메라(보기 공간)까지 정규화된 벡터입니다. 이는 투시 카메라와 직교 카메라 모두 동일합니다. |
vec2 **UV**에서 |
|
vec2 **UV2**에서 |
|
vec4에서 컬러 |
|
vec2 **POINT_COORD**에서 |
``POINT_SIZE``로 점을 그리는 점 좌표입니다. |
mat4 MODEL_MATRIX |
모델/로컬 공간을 월드 공간으로 변환합니다. |
mat3 MODEL_NORMAL_MATRIX |
모델/로컬 공간에서 노멀을 위한 월드 공간으로 변환됩니다. 객체의 크기가 불균일하게 조정되지 않는 한 기본적으로 ``MODEL_MATRIX``와 동일합니다. 이 경우 ``transpose(inverse(mat3(MODEL_MATRIX)))``로 설정됩니다. |
mat4 VIEW_MATRIX |
공간 변화를 볼 수 있는 세계 공간. |
mat4 INV_VIEW_MATRIX |
보기 공간을 월드 공간으로 변환합니다. |
mat4 PROJECTION_MATRIX |
보기 공간을 클립 공간으로 변환합니다. |
mat4 INV_PROJECTION_MATRIX |
공간 변환을 보려면 공간을 클립하세요. |
vec3 **NODE_POSITION_WORLD**에서 |
노드 위치, 월드 공간. |
vec3 **NODE_POSITION_VIEW**에서 |
노드 위치, 뷰 공간. |
vec3 **CAMERA_POSITION_WORLD**에서 |
월드 공간에서의 카메라 위치. 다중 뷰/스테레오 렌더링 시 두 눈의 중간점을 나타냅니다. |
vec3 **CAMERA_DIRECTION_WORLD**에서 |
월드 공간에서의 카메라 방향. |
단위 CAMERA_VISIBLE_LAYERS |
현재 패스를 렌더링하는 카메라의 레이어를 컬링합니다. |
vec3 **VERTEX**에서 |
보기 공간에서 조각(픽셀)의 위치입니다. 면의 정점 사이에 보간되어 뷰 공간으로 변환된 |
inout vec3 LIGHT_VERTEX |
빛과 그림자를 변경하는 데 사용할 수 있는 ``VERTEX``의 쓰기 가능한 버전입니다. 여기에 쓰면 조각의 위치가 변경되지 않습니다. |
int VIEW_INDEX |
우리가 렌더링하고 있는 뷰입니다. 멀티뷰/스테레오 렌더링에서 뷰를 구별하는 데 사용됩니다. 모노(다중 뷰 아님) 또는 왼쪽 눈의 경우 |
int VIEW_MONO_LEFT |
모노 또는 왼쪽 눈에 대한 상수이며 항상 ``0``입니다. |
int VIEW_RIGHT |
오른쪽 눈에 대한 상수, 항상 |
vec3에서 EYE_OFFSET |
뷰 공간에서 렌더링되는 눈의 위치 오프셋입니다. 멀티뷰 렌더링에만 적용 가능합니다. |
샘플러2D SCREEN_TEXTURE |
Godot 4에서는 제거되었습니다. 대신 ``sampler2D``와 ``hint_screen_texture``를 사용하세요. |
vec2에서 SCREEN_UV |
현재 픽셀의 스크린 UV 좌표입니다. |
샘플러2D 깊이_텍스쳐 |
Godot 4에서는 제거되었습니다. 대신 ``sampler2D``와 ``hint_depth_texture``를 사용하세요. |
아웃 플로트 깊이 |
사용자 정의 깊이 값(범위 |
inout vec3 정상 |
뷰 공간에서 |
inout vec3 탄젠트 |
뷰 공간에서 |
inout vec3 바이노멀 |
뷰 공간에서 |
out vec3 NORMAL_MAP |
Set normal here in tangent space if reading normal from a texture instead of |
부동 소수점 NORMAL_MAP_DEPTH |
|
out vec3 BENT_NORMAL_MAP |
Set bent normal map here in tangent space to enable bent normals. This is used to improve specular occlusion, and requires a specially authored bent normal map. The blue channel is ignored, as it's reconstructed in the engine instead. This allows bent normal maps with RGTC compression to work. |
out vec3 알베도 |
알베도(기본 흰색). 기본 색상. |
아웃 플로트 알파 |
알파(범위 |
부동 소수점 ALPHA_SCISSOR_THRESHOLD |
If written to on any branch, values below a certain amount of alpha are discarded. |
부동 소수점 ALPHA_HASH_SCALE |
알파 해시 투명도 모드를 사용할 때 알파 해시 규모입니다. 기본값은 ``1.0``입니다. 값이 높을수록 디더링 패턴에서 더 많은 픽셀이 표시됩니다. |
부동 소수점 ALPHA_ANTIALIASING_EDGE |
알파 대 커버리지 안티앨리어싱을 사용해야 하는 임계값입니다. 기본값은 |
out vec2 ALPHA_TEXTURE_COORDINATE |
알파-커버 앤티앨리어싱에 사용할 텍스처 좌표입니다. |
부동 소수점 PREMUL_ALPHA_FACTOR |
미리 곱해진 알파 인자. ``render_mode blend_premul_alpha;``를 사용하는 경우에만 유효합니다. 조명과의 상호작용을 위해 미리 곱해진 알파 블렌딩과 함께 음영 처리된 머티리얼을 사용할 때 이 항목을 작성해야 합니다. 음영 처리되지 않은 재료에는 이 작업이 필요하지 않습니다. |
아웃 플로트 메탈릭 |
금속성(범위 |
out float 반사형 |
반사광(물리적으로 변경하기에 정확하지 않음). 기본값은 ``0.5``입니다. ``0.0``는 반사를 비활성화합니다. |
아웃 플로트 거칠기 |
거칠기(범위 |
아웃 플로트 RIM |
림(범위 |
부동 소수점 RIM_TINT |
림 틴트의 범위는 ``0.0``(흰색)부터 ``1.0``(알베도)까지입니다. 사용된다면 Godot는 림 조명을 계산합니다. |
아웃 플로트 CLEARCOAT |
기존 것 위에 작은 반사 얼룩이 추가되었습니다. 사용된다면 Godot는 클리어코트를 계산합니다. |
아웃 플로트 CLEARCOAT_GLOSS |
클리어코트의 광택. 사용된다면 Godot는 클리어코트를 계산합니다. |
out float 이방성 |
접선 공간에 따라 반사 얼룩을 왜곡합니다. |
out vec2 ANISOTROPY_FLOW |
왜곡 방향, 플로우맵과 함께 사용합니다. |
부동 소수점 SSS_STRENGTH |
지하 산란의 강도. 사용하는 경우 서브서피스 스캐터링이 객체에 적용됩니다. |
out vec4 SSS_TRANSMITTANCE_COLOR |
지하 산란 투과율의 색상입니다. 사용하는 경우 표면하 산란 투과율이 개체에 적용됩니다. |
부동 소수점 SSS_TRANSMITTANCE_DEPTH |
지하 산란 투과율의 깊이입니다. 값이 높을수록 효과가 개체에 더 깊이 도달할 수 있습니다. |
부동 소수점 SSS_TRANSMITTANCE_BOOST |
|
inout vec3 백라이트 |
백라이트 색상(직사광처럼 작동하지만 법선이 빛에서 약간 멀어져도 수신됩니다). 사용하는 경우 백라이트가 개체에 적용됩니다. 표면하 산란의 더 저렴한 근사치로 사용할 수 있습니다. |
아웃 플로트 AO |
주변 폐색의 강도. 사전 베이킹된 AO와 함께 사용됩니다. |
부동 소수점 AO_LIGHT_AFFECT |
주변 폐색이 직접 조명에 영향을 미치는 정도(범위 |
out vec3 배출 |
방출 색상(HDR의 경우 ``(1.0, 1.0, 1.0)``를 초과할 수 있음) |
out vec4 FOG |
If written to on any branch, blends final pixel color with |
out vec4 빛나는 |
If written to on any branch, blends environment map radiance with |
out vec4 IRRADIANCE |
If written to on any branch, blends environment map irradiance with |
기본 내장 타입
라이트 프로세서 기능을 작성하는 것은 전적으로 선택 사항입니다. unshaded 렌더링 모드를 사용하면 light() 기능을 건너뛸 수 있습니다. 조명 함수가 작성되지 않으면 Godot는 fragment() 함수에 작성된 재료 속성을 사용하여 조명을 계산합니다(렌더링 모드에 따라 다름).
light() 함수는 모든 픽셀의 모든 조명에 대해 호출됩니다. 각 조명 유형에 대한 루프 내에서 호출됩니다.
다음은 Lambertian 조명 모델을 사용하는 사용자 정의 light() 함수의 예입니다.
void light() {
if (LIGHT_IS_AREA) {
// Area light GGX shading.
DIFFUSE_LIGHT += LIGHT_AREA_DIFFUSE_MULTIPLIER * ATTENUATION * LIGHT_COLOR;
SPECULAR_LIGHT += LIGHT_AREA_SPECULAR_MULTIPLIER * ATTENUATION * LIGHT_COLOR * SPECULAR_AMOUNT;
} else {
// Used for all other light types (directional, omni, spot).
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR / PI;
}
}
조명을 함께 추가하려면 덮어쓰는 대신 ``+=``를 사용하여 ``DIFFUSE_LIGHT``에 조명 기여를 추가하세요.
경고
vertex_lighting 렌더링 모드가 활성화되거나 프로젝트 설정에서 Rendering > Quality > Shading > Force Vertex Shading<class_ProjectSettings_property_rendering/shading/overrides/force_vertex_shading>`가 활성화된 경우 ``light()` 기능은 실행되지 않습니다. (모바일 플랫폼에서는 기본적으로 활성화되어 있습니다.)
내장 |
설명 |
|---|---|
vec2 **VIEWPORT_SIZE**에서 |
뷰포트의 크기(픽셀 단위)입니다. |
vec4에서 FRAGCOORD |
Coordinate of pixel center in screen space. |
mat4 MODEL_MATRIX |
모델/로컬 공간을 월드 공간으로 변환합니다. |
mat4 INV_VIEW_MATRIX |
보기 공간을 월드 공간으로 변환합니다. |
mat4 VIEW_MATRIX |
공간 변화를 볼 수 있는 세계 공간. |
mat4 PROJECTION_MATRIX |
보기 공간을 클립 공간으로 변환합니다. |
mat4 INV_PROJECTION_MATRIX |
공간 변환을 보려면 공간을 클립하세요. |
vec3에서 정상 |
뷰 공간의 법선 벡터입니다. |
vec2에서 SCREEN_UV |
현재 픽셀의 스크린 UV 좌표입니다. |
vec2 **UV**에서 |
|
vec2 **UV2**에서 |
|
vec3에서 보기 |
뷰 공간의 보기 벡터. |
vec3에서 빛 |
뷰 공간의 라이트 벡터입니다. |
vec3 **LIGHT_COLOR**에서 |
Light color 곱하기 light energy 곱하기 |
부동 SPECULAR_AMOUNT |
OmniLight3D 및 class_SpotLight3D`의 경우 ``2.0``에 :ref:`light_specular<class_Light3D_property_light_specular>`를 곱합니다. :ref:`class_DirectionalLight3D, ``1.0``의 경우. |
부울 LIGHT_IS_DIRECTIONAL |
|
부동 감쇠 |
거리나 그림자에 따른 감쇠입니다. |
vec3에서 알베도 |
베이스 알베도. |
vec3에서 백라이트 |
|
플로트 메탈릭 |
메탈릭. |
부동 거칠기 |
Roughness. |
out vec3 DIFFUSE_LIGHT |
확산광 결과. |
out vec3 SPECULAR_LIGHT |
반사광 결과. |
아웃 플로트 알파 |
Alpha (range |
참고
``ALPHA``가 작성될 때 투명 파이프라인을 통과하는 셰이더는 투명도 정렬 문제를 나타낼 수 있습니다. 자세한 내용과 문제를 방지하는 방법은 :ref:`3D 렌더링 제한 사항 페이지의 투명도 정렬 섹션 <doc_3d_rendering_limitations_transparency_sorting>`를 읽어보세요.
투명한 재질은 그림자를 투사하거나 hint_screen_texture 및 hint_depth_texture 유니폼에 나타날 수도 없습니다. 그러면 해당 재질이 화면 공간 반사나 굴절에 나타나는 것을 방지할 수 있습니다. SDFGI 선명한 반사는 투명한 재질에 표시되지 않습니다(투명 재질에는 거친 반사만 표시됩니다).