คำถามของคุณดูเหมือนจะสร้างความสับสนให้กับแนวคิดบางอย่างดังนั้นเรามาทำสิ่งต่าง ๆ จากด้านบน นี่คือนิยามของฟังก์ชันglTexImage2D:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
มีสองสิ่งที่คุณอาจเรียกว่า "รูปแบบพื้นผิว" แรกคือinternalformatพารามิเตอร์ นี่คือรูปแบบที่แท้จริง ของภาพที่ OpenGL เก็บไว้ formatพารามิเตอร์อธิบายส่วนหนึ่งของรูปแบบของข้อมูลพิกเซลที่คุณให้กับdataพารามิเตอร์
หากต้องการใช้อีกวิธีหนึ่งformatและtypeกำหนดว่าข้อมูลของคุณเป็นอย่างไร internalformatเป็นวิธีที่คุณบอกให้ OpenGL จัดเก็บข้อมูลของคุณ ให้เราโทรหาformatและtype"รูปแบบการถ่ายโอนพิกเซล" ในขณะที่internalformatจะเป็น "รูปแบบภาพ"
รูปแบบของภาพพื้นผิวต้องไม่มี "bgr8" ไม่มีตัวระบุรูปแบบภาพ GL_BGR8 มีเป็น enum GL_BGR แต่ที่เป็นสำหรับรูปแบบการถ่ายโอนพิกเซลไม่ใช่รูปแบบภาพ
หรือเพื่อใช้เป็นวิธีอื่นข้อมูลพิกเซลของคุณที่คุณให้ OpenGL สามารถจัดเก็บได้ตามลำดับ BGR แต่การใช้งาน OpenGL ตัดสินใจด้วยตัวเองว่าจะเก็บข้อมูลพิกเซลนั้นอย่างไร บางทีมันอาจจะเก็บไว้ในลำดับเล็ก ๆ น้อย ๆ บางทีมันอาจจะเก็บมันใหญ่โต บางทีมันอาจเป็นเพียงแค่การจัดเรียงไบต์ใหม่โดยพลการ คุณไม่รู้และ OpenGL ไม่มีวิธีการค้นหา
ไม่มีวิธีที่จะบอกได้ว่าพารามิเตอร์รูปแบบการถ่ายโอนพิกเซลชุดใดชุดหนึ่งตรงกับวิธีการใช้งาน OpenGL จะเก็บไว้ในรูปแบบภาพหรือไม่
มีวิธีบอกตอนนี้ และโดย "ตอนนี้" ฉันหมายถึงใน OpenGL 4.3 และ / หรือ ARB_internalformat_query2 มาถึงการ์ดกราฟิกใกล้บ้านคุณ:
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และtypeตอนนี้มีการใช้งานที่ต้องการformatและtypeสำหรับการglTex(Sub)ImageโทรไปยังGL_RGBA8รูปภาพ มีแยกต่างหากformatและtypeแบบสอบถามสำหรับการglReadPixelsดาวน์โหลด
มีคำสั่งอื่น ๆ ที่คุณสามารถทำให้
หากคุณไม่สามารถเข้าถึงสิ่งเหล่านี้คุณสามารถใช้กฎทั่วไปของหัวแม่มือที่ฮาร์ดแวร์ส่วนใหญ่จะปฏิบัติตาม:
- จะเก็บข้อมูลพิกเซลสำหรับข้อมูล 8 บิตต่อช่องตามลำดับ BGRA ดังนั้นหากคุณต้องการเพื่อให้ตรงกับรูปแบบที่มีข้อมูลพิกเซลของคุณเพื่อให้เป็นไปอย่างรวดเร็วยิ่งขึ้นอัปโหลดข้อมูลพื้นผิวที่คุณต้องการใช้
GL_BGRAสำหรับformatและGL_UNSIGNED_INT_8888หรือสำหรับGL_UNSIGNED_BYTEtype
- จะไม่เก็บสี 24 บิตเป็น 24 บิต มันจะเอามันออกไปเป็น 32- บิต; อัลฟาจะถูกละเว้นเมื่อมันอ่านข้อมูล ดังนั้นหากคุณต้องการจับคู่รูปแบบให้ใช้
GL_BGRA formatกับGL_RGB8รูปแบบรูปภาพทุกครั้งแม้ว่าคุณจะต้องใส่ข้อมูลจำลองในองค์ประกอบอัลฟา