Skip to content

Commit 91e9758

Browse files
shienaj20001970
andcommitted
Support packed YCbCr format
Co-authored-by: Jason Kuo <[email protected]>
1 parent 17b0b23 commit 91e9758

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

misc/camera_feed/camerafeed.gd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,11 @@ func _on_frame_changed() -> void:
131131
var rgb_texture: CameraTexture = mat.get_shader_parameter("rgb_texture")
132132
var y_texture: CameraTexture = mat.get_shader_parameter("y_texture")
133133
var cbcr_texture: CameraTexture = mat.get_shader_parameter("cbcr_texture")
134+
var ycbcr_texture: CameraTexture = mat.get_shader_parameter("ycbcr_texture")
134135
rgb_texture.which_feed = CameraServer.FeedImage.FEED_RGBA_IMAGE
135136
y_texture.which_feed = CameraServer.FeedImage.FEED_Y_IMAGE
136137
cbcr_texture.which_feed = CameraServer.FeedImage.FEED_CBCR_IMAGE
138+
ycbcr_texture.which_feed = CameraServer.FEED_YCBCR_IMAGE
137139
match datatype:
138140
CameraFeed.FeedDataType.FEED_RGB:
139141
rgb_texture.camera_feed_id = camera_feed.get_id()
@@ -147,6 +149,11 @@ func _on_frame_changed() -> void:
147149
mat.set_shader_parameter("cbcr_texture", cbcr_texture)
148150
mat.set_shader_parameter("mode", 1)
149151
preview_size = y_texture.get_size()
152+
CameraFeed.FeedDataType.FEED_YCBCR:
153+
ycbcr_texture.camera_feed_id = camera_feed.get_id()
154+
mat.set_shader_parameter("ycbcr_texture", ycbcr_texture)
155+
mat.set_shader_parameter("mode", 2)
156+
preview_size = ycbcr_texture.get_size()
150157
_:
151158
print("YCbCr format not fully implemented yet")
152159
return

misc/camera_feed/camerafeed.tscn

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_scene load_steps=10 format=3 uid="uid://oiv4p8ii3am4"]
1+
[gd_scene load_steps=11 format=3 uid="uid://oiv4p8ii3am4"]
22

33
[ext_resource type="Script" uid="uid://dxaoavn781kxe" path="res://camerafeed.gd" id="1_fuswq"]
44
[ext_resource type="Shader" uid="uid://dhjh7s6i7jnlp" path="res://ycbcr_to_rgb.gdshader" id="2_0uyi5"]
@@ -9,11 +9,14 @@
99

1010
[sub_resource type="CameraTexture" id="CameraTexture_xep8u"]
1111

12+
[sub_resource type="CameraTexture" id="CameraTexture_fuswq"]
13+
1214
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lgiw1"]
1315
shader = ExtResource("2_0uyi5")
1416
shader_parameter/rgb_texture = SubResource("CameraTexture_nyeft")
1517
shader_parameter/y_texture = SubResource("CameraTexture_xep8u")
1618
shader_parameter/cbcr_texture = SubResource("CameraTexture_7c2aw")
19+
shader_parameter/ycbcr_texture = SubResource("CameraTexture_fuswq")
1720
shader_parameter/mode = 0
1821

1922
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1"]

misc/camera_feed/ycbcr_to_rgb.gdshader

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,25 @@ uniform sampler2D rgb_texture;
55
uniform sampler2D y_texture;
66
// CbCr component texture (Feed ID 2 -> FEED_CBCR_IMAGE)
77
uniform sampler2D cbcr_texture;
8-
// mode: 0 -> RGB, mode: 1 -> YCbCr
9-
uniform int mode : hint_range(0, 1);
8+
// YCbCr component texture (Feed ID 1 -> FEED_YCBCR_IMAGE)
9+
uniform sampler2D ycbcr_texture;
10+
// mode: 0 -> RGB, mode: 1 -> YCbCr_sep, mode: 2 -> YCbCr
11+
uniform int mode : hint_range(0, 2);
1012

1113
// YCbCr to RGB conversion (BT.601 standard)
1214
void fragment() {
1315
vec3 color;
14-
color.r = texture(y_texture, UV).r;
15-
color.gb = texture(cbcr_texture, UV).rg - vec2(0.5, 0.5);
16+
17+
if (mode == 1) {
18+
color.r = texture(y_texture, UV).r;
19+
color.gb = texture(cbcr_texture, UV).rg - vec2(0.5, 0.5);
20+
} else if (mode == 2) {
21+
vec2 UV_u = UV - floor(mod(UV / TEXTURE_PIXEL_SIZE, 2)) * vec2(1, 0) * TEXTURE_PIXEL_SIZE;
22+
vec2 UV_v = UV + (vec2(1, 0) - floor(mod(UV / TEXTURE_PIXEL_SIZE, 2))) * vec2(1, 0) * TEXTURE_PIXEL_SIZE;
23+
color.r = texture(ycbcr_texture, UV).r;
24+
color.g = texture(ycbcr_texture, UV_u).g - 0.5;
25+
color.b = texture(ycbcr_texture, UV_v).g - 0.5;
26+
}
1627

1728
// YCbCr -> SRGB conversion
1829
// Using BT.709 which is the standard for HDTV
@@ -23,5 +34,5 @@ void fragment() {
2334
* color.rgb;
2435

2536
vec3 rgb = texture(rgb_texture, UV).rgb;
26-
COLOR = vec4(mix(rgb, color, float(mode)), 1.0);
37+
COLOR = vec4(mix(rgb, color, clamp(float(mode), 0.0, 1.0)), 1.0);
2738
}

0 commit comments

Comments
 (0)