2008-11-29 30 views
9

Có thể bơm đơn sắc (dữ liệu đồ họa có độ sâu hình ảnh 1 bit) kết cấu vào OpenGL không?OpenGL và kết cấu đơn sắc

Tôi hiện đang sử dụng này:

glTexImage2D(GL_TEXTURE_2D, 0, 1, game->width, game->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, game->culture[game->phase]); 

Tôi bơm nó với mảng vuông các số nguyên unsigned 8 bit trong chế độ GL_LUMINANCE (một kênh 8 bit đại diện cho độ sáng của tất cả 3 kênh và alpha đầy đủ), nhưng IMO không bao giờ hiệu quả, bởi vì các giá trị onlu trong mảng là 0x00 và 0xFF.

Tôi có thể (và cách sử dụng) sử dụng mảng bit-bit trên mỗi pixel đơn giản thay thế bằng cách nào đó không? Kích thước mảng quá chậm bất kỳ hoạt động khác trên mảng :(

Trả lời

5

sự không nén kết cấu dạng nhỏ nhất cho hình ảnh sáng sử dụng 8 bit cho mỗi pixel.

Tuy nhiên, 1 bit cho mỗi hình ảnh điểm ảnh có thể được nén mà không mất đến định dạng S3TC hoặc DXT, sẽ không có 1 bit trên mỗi pixel nhưng ở đâu đó giữa 2 và 3 bit

Nếu bạn thực sự cần 1 bit cho mỗi pixel, bạn có thể làm như vậy với một mẹo nhỏ. kết cấu như là một 8-bit Alpha-chỉ kết cấu (hình ảnh 1 được nạp vào bit 1, hình ảnh 2 thành bit 2 và vv) Một khi bạn đã làm điều đó bạn có thể "địa chỉ" mỗi tiểu họa tiết bằng cách sử dụng thử nghiệm alpha tính năng và một chút kết cấu lập trình môi trường để biến alpha thành màu.

Điều này sẽ chỉ hoạt động nếu bạn có 8 1 bit cho mỗi điểm ảnh kết cấu và khó khăn để có được quyền mặc dù.

+0

Các 8 kết cấu lừa âm thanh thú vị, nhưng nó không thực sự là những gì tôi đang tìm kiếm. Tôi đang sử dụng OpenGL để trực quan hóa dữ liệu từ ứng dụng của tôi, do đó, lừa như vậy sẽ làm chậm hoạt động tiêu chuẩn trên mảng (không nói về các biến chứng lập trình). –

13

Sau khi một số nghiên cứu, tôi đã có thể làm cho 1-bit cho mỗi hình ảnh pixel làm kết cấu với đoạn mã sau:

static GLubyte smiley[] = /* 16x16 smiley face */ 
{ 
    0x03, 0xc0, /*  ****  */ 
    0x0f, 0xf0, /*  ********  */ 
    0x1e, 0x78, /* **** **** */ 
    0x39, 0x9c, /* *** ** *** */ 
    0x77, 0xee, /* *** ****** *** */ 
    0x6f, 0xf6, /* ** ******** ** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x3f, 0xfc, /* ************ */ 
    0x1f, 0xf8, /* ********** */ 
    0x0f, 0xf0, /*  ********  */ 
    0x03, 0xc0 /*  ****  */ 
}; 

float index[] = {0.0, 1.0}; 

glPixelStorei(GL_UNPACK_ALIGNMENT,1); 

glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, index); 

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,16,16,0,GL_COLOR_INDEX,GL_BITMAP,smiley); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

và đây là kết quả:

enter image description here

+0

Rất tuyệt! Bạn đã so sánh hiệu suất của nó với biến thể 1 byte trên mỗi pixel? –

+0

Nó không xuất hiện mà bạn có thể kẹp kết cấu này mà không thay đổi hình dạng. Tôi chỉ cố gắng thoát khỏi dòng chảy qua biên giới. – Kaliber64

+0

Tôi thấy việc hoán đổi định dạng nội bộ thành 'LUMINANCE' sẽ tạo ra cùng một hình ảnh với một phần tư bộ nhớ. Nếu có bất kỳ định dạng nhỏ hơn tôi sẽ được quan tâm. Idk làm thế nào để có được định dạng S3TC. Tôi không nghĩ rằng pyOpenGL có những phần mở rộng đó. – Kaliber64

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