2010-08-02 24 views
10

Tôi đang tạo hình ảnh bằng thạch anh 2d và tôi muốn sử dụng hình ảnh đó làm kết cấu tròn. Phần khó khăn là tôi muốn sử dụng càng ít bit trên mỗi pixel càng tốt, vì vậy tôi tạo cgContext như sau:Sử dụng hình ảnh được tạo bằng CGBitmapContextCreate dưới dạng kết cấu opengl

int bitsPerComponent = 5; 
int bytesPerPixel = 2; 
int width = 1024; 
int height = 1024; 
void* imageData = malloc(width * height * bytesPerPixel); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGImageContext context = CGBitmapContextCreate(imageData, width, height, bitsPerComponent, width * bytesPerPixel, colorSpace, kCGImageAlphaNoneSkipFirst); 
//draw things into context, release memory, etc. 

Như đã nêu trong tài liệu hướng dẫn here, đây là chỉ hỗ trợ định dạng pixel RGB cho CGBitmapContextCreate sử dụng 16 bit trên mỗi pixel. Vì vậy, bây giờ tôi muốn tải lên hình ảnh nàyData trông giống như "1 bit bỏ qua - 5 bit màu đỏ - 5 bit màu xanh lá cây - 5 bit xanh" thành kết cấu tròn. Vì vậy, tôi nên làm một cái gì đó như thế này:

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, imageData); 

Điều đó sẽ không hoạt động vì trong cuộc gọi này tôi đã chỉ định định dạng pixel là "5 red - 5 green - 5 blue - 1 alpha". Điều đó là sai, nhưng có vẻ như không có định dạng nào phù hợp với đầu ra đồ họa lõi.
Có một số tùy chọn khác như GL_UNSIGNED_SHORT_1_5_5_5_REV, nhưng những tùy chọn này sẽ không hoạt động trên iphone.

Tôi cần một số cách để sử dụng hình ảnh nàyData như một kết cấu, nhưng tôi thực sự không muốn trao đổi byte xung quanh bằng tay bằng cách sử dụng memset hoặc như vậy, bởi vì điều đó có vẻ khủng khiếp không hiệu quả.

+0

Tại sao sự quan tâm về 5 bit trên mỗi pixel? Tại sao không chỉ có bối cảnh của bạn là những gì làm việc dễ dàng nhất cho opengl và nếu hình ảnh nguồn của bạn là khác nhau cho phép thạch anh để làm việc chuyển đổi khi nó rút nó vào bối cảnh của bạn? Tôi có đủ loại kết cấu động trong trò chơi của mình và chưa bao giờ gặp phải những vấn đề này. – badweasel

+0

Tôi đã tạo câu hỏi này vào năm 2010, khi chúng tôi vẫn đang hỗ trợ 2g deivces. 2g và 3g cả hai đều có rất ít memmory, và các ứng dụng không phải là một trò chơi - đó là một người đọc ebook. Chúng tôi đã phải sử dụng ít nhất 10MB dữ liệu chỉ dành cho công cụ phân tích cú pháp/tạo kiểu/bố cục văn bản của chúng tôi và mỗi bit nhỏ của byte là rất quan trọng. Tôi không chắc chắn rằng ai đó có thể phải sử dụng điều này trong năm 2012, nhưng có lẽ vẫn có những ứng dụng ngoài đó bị giết với cảnh báo memmory và muốn giảm dấu chân memmory. – Alexey

+0

@Alexey: Bạn có thể vui lòng cho chúng tôi biết, độ phân giải của dữ liệu hình ảnh bạn đang tải cho kết cấu là gì? – 8Ours

Trả lời

2

Bạn cần trao đổi các bit xung quanh để biến nó thành định dạng dày đặc hơn như RGBA551 hoặc RGB565, vì bạn lưu ý, CGBitmapContext không hỗ trợ các định dạng này để vẽ (vì tính đơn giản và hiệu quả).

memset sẽ không thực hiện thủ thuật, nhưng có thói quen chuyển đổi "nhanh" trong Accelerate.framework.

Xem vImageConvert_ARGB8888toRGB565(…)vImageConvert_ARGB8888toARGB1555(…), có sẵn trên iOS 5 trở lên.

1

Đối với iOS 7.0, hệ điều hành X.9 và sau:

vImage_CGImageFormat fmt = { 
    .bitsPerComponent = 5, 
    .bitsPerPixel = 16, 
    .colorSpace = NULL, // faster with CGImageGetColorSpace(cgImage) if known to be RGB 
    .bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder16Little // ARGB1555 little endian 
}; 
vImage_Buffer buf; 
vImageBuffer_InitWithCGImage(&buf, &fmt, NULL, cgImage, kvImageNoFlags); 

...

free(buf.data); 

dữ liệu là trong buf.data, cùng với chiều cao hình ảnh, chiều rộng và thông tin rowBytes. Tôi không nhớ những gì yêu cầu của GL là cho dù đệm hàng được cho phép. Bạn có thể kiểm soát điều đó bằng cách preallocating các trường buf.data và buf.rowBytes và chuyển kvImageDoNotAllocate trong các cờ.

565_REV là kCGImageAlphaNone | kCGBitmapByteOrder16Little. 5551_REV là kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder16Little

Các vấn đề liên quan