[Godot] Shader for Sprite Colorkey 스프라이트 컬러키 셰이더
Godot 2024. 2. 17. 21:54 |Godot Sprite에는 Colorkey를 설정하는 옵션이 없다.PNG 이미지는 알파 채널을 통해 투명 배경을 설정할 수 있어 상관 없지만 JPG, BMP같은 이미지 파일은 투명 배경이 없어 곤란하다. 하지만 셰이더를 이용해 같은 효과를 만들 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
shader_type canvas_item;
// Get texture and a key that we want as transparent
uniform sampler2D Diffuse;
uniform vec4 ChromaKey : source_color;
void vertex() {
// Called for every vertex the material is visible on.
}
void fragment() {
// Called for every pixel the material is visible on.
// The color value is the sampled pixel color
COLOR = texture(Diffuse, UV);
// If the color is the same as the chroma key, make it transparent.
if (COLOR == ChromaKey) {
COLOR.a = 0.0;
}
}
//void light() {
// Called for every pixel for every light affecting the CanvasItem.
// Uncomment to replace the default light processing function with this one.
//}
|
위와 같은 코드를 작성한다.
ChromaKey: R:54 G:61 B:82 A:255 (Godot 이미지의 배경색)
Diffuse: 텍스쳐 이미지와 동일하게 지정
※ Diffuse에 이미지 지정시 Texture 파라미터의 filter를 선택할 수 없어 이미지가 흐리게 보일 수 있다. 필요하다면 셰이더 코드에서 Diffuse 선언을 아래와 같이 수정한다.
uniform sampler2D Diffuse : filter_nearest;
1
2
3
4
|
// If the color is the same as the chroma key, make it transparent.
if (distance(COLOR, ChromaKey) < 0.001) {
COLOR.a = 0.0;
}
|
vec4 타입의 ChromaKey와 COLOR 데이터 타입의 비교에서 약간의 오차가 발생하는거 같다.
if()을 위와 같이 수정한다.
※ 참고
이렇게 하나의 스프라이트에 셰이더를 적용하면 같은 씬의 다른 스프라이트에도 모두 같은 방식으로 셰이더를 적용해야 아래와 같은 에러가 생기지 않는 경우가 발생할 수 있다.
E 0:00:01:0199 swap_buffers: Vulkan: Cannot submit graphics queue. Error code: VK_ERROR_DEVICE_LOST
<C++ Error> Condition "err" is true. Returning: ERR_CANT_CREATE
<C++ Source> drivers/vulkan/vulkan_context.cpp:2536 @ swap_buffers()
E 0:00:01:0208 prepare_buffers: Vulkan: Did not create swapchain successfully. Error code: VK_NOT_READY
<C++ Error> Condition "err != VK_SUCCESS" is true. Breaking.
<C++ Source> drivers/vulkan/vulkan_context.cpp:2459 @ prepare_buffers()
'Godot' 카테고리의 다른 글
[Godot] 3D Object Sprite in 2D Scene (0) | 2024.02.22 |
---|---|
[Godot] Line2D 선 그리기 (0) | 2024.02.21 |
[Godot] Transparent Background Window 투명 배경 윈도우 (0) | 2024.02.17 |
[Godot] Sprite2D Simple Animation 스프라이트 간단한 애니메이션 (0) | 2024.02.17 |
[Godot] AnimationPlayer 애니메이션 플레이어 (0) | 2024.02.16 |