คำถามของคุณดูเหมือนจะสร้างความสับสนให้กับแนวคิดบางอย่างดังนั้นเรามาทำสิ่งต่าง ๆ จากด้านบน นี่คือนิยามของฟังก์ชัน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_BYTE
type
- จะไม่เก็บสี 24 บิตเป็น 24 บิต มันจะเอามันออกไปเป็น 32- บิต; อัลฟาจะถูกละเว้นเมื่อมันอ่านข้อมูล ดังนั้นหากคุณต้องการจับคู่รูปแบบให้ใช้
GL_BGRA
format
กับGL_RGB8
รูปแบบรูปภาพทุกครั้งแม้ว่าคุณจะต้องใส่ข้อมูลจำลองในองค์ประกอบอัลฟา