Tại sao phải sao chép các bit cao hơn của RGB565 khi chuyển đổi sang RGBA8888?


7

Tôi đã thấy trong một số cơ sở mã của phần mềm đồ họa máy tính rằng đôi khi các bit cao hơn của dữ liệu hình ảnh định dạng RGB565 được sao chép thành các bit thấp hơn khi chuyển đổi sang định dạng RGBA8888 có độ sâu bit cao hơn.

Tôi đã tìm thấy ví dụ bình luận của người dùng "eq" trong chủ đề gamedev.net này :

Tôi thích sao chép các bit cao hơn thành các bit thấp hơn không xác định:
R8 = (R5 << 3) | (R5 >> 2);

Tuy nhiên tôi không hiểu lý do đằng sau.

Điều gì sử dụng mục đích sao chép các bit đó vào dữ liệu được chuyển đổi?


1
Nếu không sao chép các bit, LSB sẽ là 0, vì vậy với giá trị tối đa là 0x1f (tối đa cho 5 bit), nó sẽ mở rộng thành 0xf8 khi được chuyển đổi thành 8 bit. Những gì bạn muốn là 0xff, vì vậy phạm vi 0x00-> 0x1f sẽ được ánh xạ thành 0x00-> 0xff thay vì 0x00-> 0xf8.
PaulHK

2
@PaulHK Xin vui lòng gửi đó như là một câu trả lời. Nó hoàn thành như hiện tại, nhưng như một bình luận, nó không thể tìm kiếm được.
Dan Hulme

Có, cảm ơn bạn @PaulHK câu trả lời này chính xác cho câu hỏi của tôi
xóa

Câu trả lời:


7

Nếu không sao chép các bit, LSB sẽ là 0, vì vậy với giá trị tối đa là 0x1f (tối đa cho 5 bit), nó sẽ mở rộng thành 0xf8 khi được chuyển đổi thành 8 bit. Những gì bạn muốn là 0xff, vì vậy phạm vi 0x00-> 0x1f sẽ được ánh xạ thành 0x00-> 0xff thay vì 0x00-> 0xf8. Nếu không hợp nhất LSB, bạn sẽ không thể chuyển đổi 0x1f, 0x1f, 0x1f sang màu trắng (0xff, 0xff, 0xff). Ngẫu nhiên, điều này giống như N * 0xff / 0x1f.

Example: 

left shift only (<< 3)
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000000     (0x10 -> 0x80)
%---11111 -> %11111000     (0x1f -> 0xf8)

merging MSB to LSB 
%---00001 -> %00001000     (0x01 -> 0x08)
%---10000 -> %10000100     (0x10 -> 0x84)
$---11111 -> %11111111     (0x1f -> 0xff)

7

Thực sự có một lý do toán học khá hợp lý để thực hiện sao chép bit:

NN2n-1Mn<m

N2n-1M2m-1

N.(2n+1)(2n-1)(2n+1)M2m-1
N.(2n+1)22n-1M2m-1

n{5,6}m= =số 8

N.(2n+1)22nM2m
N.(2n+1)22n-mM

N.(2n+1)2n-m

QED

M= =((2m-1)N2n-1+12nhưng sự gần đúng này, nói chung, hoạt động hầu hết thời gian. Tất nhiên, có những lúc nó không chính xác, nhưng IIRC chỉ bằng một bit và tương đối không thường xuyên.


2
Cảm ơn bạn đã giải thích chi tiết với các công thức tốt đẹp. Tôi tò mò về lỗi được giới thiệu bởi phép tính gần đúng nên tôi đã tạo biểu đồ này để so sánh cả hai công thức: desmos.com/calculator/cvaqofyvbf . Tuy nhiên tôi thích câu trả lời của PaulHK hơn vì nó dễ hiểu hơn.
lau

1
Phân minh nhỏ, nếu m> = 2n thì bạn cần thay đổi phương trình "xấp xỉ" của mình. Một ví dụ cực đoan là nếu n = 1, thì bạn cần lặp lại chuỗi 8 lần (tức là thực hiện log2 (8) = 3 bước). Tất nhiên, nếu bạn đệm bằng "10 ... 0" thay vì tất cả các số không, thì trung bình bạn sẽ có lỗi thấp hơn, nhưng mất đi các thái cực. "Tuy nhiên tôi thích câu trả lời của PaulHK" :-) Chà, không có kế toán cho hương vị 8P.
Simon F
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.