Câu hỏi của bạn dường như gây nhầm lẫn các khái niệm nhất định, vì vậy hãy lấy những thứ từ đầu. Đây là định nghĩa của hàm glTexImage2D
:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Có hai điều mà bạn có thể gọi là "định dạng kết cấu". Đầu tiên là internalformat
tham số. Đây là định dạng thực của hình ảnh khi OpenGL lưu trữ nó. Các format
tham số mô tả một phần của định dạng của dữ liệu pixel bạn đang cung cấp với các data
tham số.
Nói cách khác, format
và type
xác định dữ liệu của bạn trông như thế nào. internalformat
là cách bạn nói với OpenGL để lưu trữ dữ liệu của bạn. Hãy để chúng tôi gọi format
và type
"định dạng chuyển pixel", trong khi đó internalformat
sẽ là "định dạng hình ảnh".
Định dạng hình ảnh của một kết cấu không bao giờ có thể là "bgr8". Không có liệt kê định dạng hình ảnh GL_BGR8. Có là một enum GL_BGR, nhưng đó là dành cho các định dạng chuyển pixel, không phải là định dạng hình ảnh.
Hoặc nói cách khác, dữ liệu pixel mà bạn cung cấp cho OpenGL có thể được lưu trữ theo thứ tự BGR. Nhưng việc triển khai OpenGL tự quyết định cách lưu trữ dữ liệu pixel đó. Có lẽ nó lưu trữ nó theo thứ tự endian nhỏ. Có lẽ nó lưu trữ nó cuối lớn. Có lẽ nó chỉ tùy ý sắp xếp lại các byte. Bạn không biết và OpenGL không cung cấp cách để tìm hiểu.
Không có cách nào để biết liệu một tập hợp các tham số định dạng chuyển pixel cụ thể có khớp với cách triển khai OpenGL sẽ lưu trữ chúng theo định dạng hình ảnh hay không.
Có một cách để nói bây giờ. Và theo "bây giờ", ý tôi là trong OpenGL 4.3 và / hoặc ARB_iternalformat_query2. Đến với một card đồ họa gần bạn:
GLenum format, type;
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &format);
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &type);
format
và type
bây giờ có ưu tiên thực hiện format
và type
sử dụng glTex(Sub)Image
các cuộc gọi đến GL_RGBA8
hình ảnh. Có riêng biệt format
và type
truy vấn để glReadPixels
tải về.
Có những truy vấn khác bạn có thể thực hiện .
Nếu bạn không có quyền truy cập vào các mục này, bạn có thể sử dụng một số quy tắc chung mà hầu hết phần cứng sẽ tuân thủ:
- sẽ lưu trữ dữ liệu pixel cho dữ liệu 8 bit trên mỗi kênh theo thứ tự BGRA. Vì vậy, nếu bạn muốn khớp định dạng với dữ liệu pixel của mình, để nhanh chóng tải lên dữ liệu kết cấu, bạn muốn sử dụng
GL_BGRA
cho format
và GL_UNSIGNED_INT_8888
hoặc GL_UNSIGNED_BYTE
cho type
.
- sẽ không thực sự lưu trữ màu 24 bit dưới dạng 24 bit. Nó sẽ luôn đệm chúng ra 32 bit; alpha sẽ chỉ bị bỏ qua khi nó đọc dữ liệu. Vì vậy, nếu bạn muốn khớp các định dạng, luôn luôn sử dụng
GL_BGRA
format
với GL_RGB8
các định dạng hình ảnh, ngay cả khi bạn phải đặt dữ liệu giả trong thành phần alpha.