Nó chắc chắn là đáng học tập OpenGL ES2.0 shaders:
- Bạn có thể cân bằng tải giữa GPU và CPU (ví dụ giải mã video của khung tiếp theo trong khi GPU renders khung hiện hành).
- Các khung hình video cần phải đi tới GPU trong mọi trường hợp: sử dụng
YCbCr
giúp bạn tiết kiệm 25% băng thông bus nếu video của bạn có độ phân giải mẫu là 4: 2: 0.
- Bạn nhận được 4: 2: 0 chrominance up-lấy mẫu miễn phí, với phần cứng nội suy GPU. (Trình đổ bóng của bạn nên được cấu hình để sử dụng cùng tọa độ đỉnh cho cả các họa tiết
Y
và C{b,r}
, trong đó kéo dài kết cấu sắc độ ra ngoài cùng một khu vực.)
- Khi kết cấu iOS5 đẩy
YCbCr
lên nhanh (không sao chép dữ liệu hoặc swizzling) với bộ nhớ cache kết cấu (xem các chức năng API CVOpenGLESTextureCache*
). Bạn sẽ tiết kiệm được 1-2 bản sao dữ liệu so với NEON.
Tôi đang sử dụng các kỹ thuật này để có hiệu quả tuyệt vời in my super-fast iPhone camera app, SnappyCam.
Bạn đang đi đúng hướng để triển khai: sử dụng kết cấu GL_LUMINANCE
cho Y
và GL_LUMINANCE_ALPHA
nếu số CbCr
của bạn được xen kẽ. Nếu không, hãy sử dụng ba họa tiết GL_LUMINANCE
nếu tất cả các thành phần YCbCr
của bạn không được xen kẽ.
Tạo hai textures cho 4: 2: 0 bi-phẳng YCbCr
(nơi CbCr
là xen kẽ) là đơn giản:
glBindTexture(GL_TEXTURE_2D, texture_y);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_LUMINANCE, // Texture format (8bit)
width,
height,
0, // No border
GL_LUMINANCE, // Source format (8bit)
GL_UNSIGNED_BYTE, // Source data format
NULL
);
glBindTexture(GL_TEXTURE_2D, texture_cbcr);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_LUMINANCE_ALPHA, // Texture format (16-bit)
width/2,
height/2,
0, // No border
GL_LUMINANCE_ALPHA, // Source format (16-bits)
GL_UNSIGNED_BYTE, // Source data format
NULL
);
nơi sau đó bạn sẽ sử dụng glTexSubImage2D()
hoặc kết cấu bộ nhớ cache iOS5 để cập nhật những kết cấu.
Tôi cũng khuyên bạn nên sử dụng 2D varying
kéo dài không gian tọa độ kết cấu (x: [0,1], y: [0,1])
để tránh bất kỳ kết cấu phụ thuộc nào đọc trong trình đổ bóng phân đoạn của bạn. Kết quả cuối cùng là siêu nhanh và không tải GPU theo kinh nghiệm của tôi.
Cảm ơn bạn rất nhiều, tôi đã thực sự làm mọi thứ gần giống như bạn mô tả, nhưng tôi không biết về các tính năng mới trong iOS 5. Gonna hãy dùng thử. – pawlowski
Cảm ơn câu trả lời của bạn. Tôi có thể tìm hiểu thêm về định dạng pixel giải mã gốc trên iOS (để đáp ứng với pt # 2) của bạn ở đâu? – fionbio