Sorunuz belirli kavramları karıştırıyor gibi görünüyor, bu yüzden şeyleri üstten alalım. Bu fonksiyonun tanımıdır glTexImage2D
:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
"Doku formatları" diyebileceğiniz iki şey vardır. Birincisi internalformat
parametredir. Bu, görüntünün OpenGL tarafından saklandığı şekliyle gerçek biçimidir . format
Parametre piksel verilerinin biçimi parçasını anlatmaktadır sizinle sağlıyoruz data
parametresi.
Diğer bir deyişle, için format
ve type
tanımlamak için veri görünüyor gibi. internalformat
OpenGL'ye verilerinizi depolamasını nasıl söylediğinizdir . Bizi arayalım format
ve type
"piksel aktarım formatı", internalformat
"imaj formatı" olacak.
Bir dokunun görüntü formatı asla "bgr8" olamaz. GL_BGR8 görüntü formatı numaralandırıcısı yok. Orada olan bir GL_BGR enum, ama bu piksel transferi biçiminde değil, görüntü formatı içindir.
Veya başka bir deyişle, OpenGL'ye verdiğiniz piksel verileriniz BGR düzeninde saklanabilir. Ancak OpenGL uygulaması, bu piksel verilerinin gerçekte nasıl saklanacağına kendi başına karar verir. Belki de küçük endian düzeninde saklar. Belki onu büyük endian depolar. Belki de sadece baytları keyfi olarak yeniden düzenler. Bilmiyorsunuz ve OpenGL bunu öğrenmenin bir yolunu sunmuyor.
Belirli bir piksel aktarım formatı parametreleri kümesinin, görüntü formatı göz önüne alındığında OpenGL uygulamasının bunları nasıl saklayacağını eşleştirip eşleştirmediğini anlamanın bir yolu yoktur.
Şimdi anlatmanın bir yolu var . Ve "şimdi" ile, OpenGL 4.3 ve / veya ARB_internalformat_query2'de kastediyorum. Yakınınızdaki bir grafik kartına geliyor:
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
ve type
şimdi uygulamanın tercihlerini format
ve görsel çağrılarını type
kullanmak glTex(Sub)Image
için GL_RGBA8
. İndirmeler için ayrı format
ve type
sorgular vardır glReadPixels
.
Yapabileceğiniz başka sorgular da var .
Bunlara erişiminiz yoksa, çoğu donanımın uyacağı genel kurallar kullanabilirsiniz:
- kanal başına 8 bit veri için piksel verilerini BGRA düzeninde depolar. Daha çabuk böylece gibi bir uygulamayla piksel verileri ile biçimiyle eşleşecek doku veriler yüklemek istiyorsanız, kullanmak istediğiniz
GL_BGRA
için format
, ve GL_UNSIGNED_INT_8888
ya GL_UNSIGNED_BYTE
için type
.
- 24 bit renkleri 24 bit olarak depolamaz. Onları her zaman 32 bite kadar dolduracaktır; alfa sadece verileri okuduğunda yok sayılır. Yani, biçimleri eşleşecek hep kullanmak istiyorsanız
GL_BGRA
format
ile GL_RGB8
alfa bileşeninde kukla verileri koymak zorunda bile görüntü formatları.