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à internalformattham số. Đây là định dạng thực của hình ảnh khi OpenGL lưu trữ nó. Các formattham 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 datatham số.
Nói cách khác, formatvà typexác định dữ liệu của bạn trông như thế nào. internalformatlà 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 formatvà type"định dạng chuyển pixel", trong khi đó internalformatsẽ 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);
formatvà typebây giờ có ưu tiên thực hiện formatvà typesử dụng glTex(Sub)Imagecác cuộc gọi đến GL_RGBA8hình ảnh. Có riêng biệt formatvà typetruy vấn để glReadPixelstả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_BGRAcho formatvà GL_UNSIGNED_INT_8888hoặc GL_UNSIGNED_BYTEcho 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 formatvới GL_RGB8cá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.