GlActiveTexture ve glBindTexture arasındaki farklılıkları ve ilişkileri
Anladığım kadarıyla, glActiveTexture
aktif ayarlar"". doku birimi Her doku birimi birden fazla doku hedefler (genellikle GL_TEXTURE_1D, 2D, 3D) CUBE_MAP olabilir.
Eğer ben doğru anlamak, aramalısın glActiveTexture
set doku birimi ilk (başlatıldı GL_TEXTURE0), sonra bir de onları birleştirmek (bir veya daha fazla) "hedef doku" için bu doku birimi?
Doku birimleri sayısı sistemden sisteme göre değişir. Benim kitaplıkta 32 için çeteleler görüyorum. Bu aslında benim GPU sınırı minimum alabilir miyim yani sanırım (ki bence168) ve herhangi bir anda GPU bellek 32 dokular? Benim GPU maksimum bellek (güya 1 GB) daha fazla istemiyorum ek bir limit var sanırım.
Hedef doku ve doku birimleri arasındaki ilişki doğru mu anlamışım? Hadi 16 adet ve 4 hedef her hakkım var ki, o=16*4 64 oda var yani hedefleri mi, yoksa böyle çalışmıyor?
Genellikle bir doku yüklemek istiyorum gelecek. glTexImage2D
ile bunu yapabilirsiniz. İlk bağımsız değişken olan doku bir hedef. Eğer bu works like glBufferData
, sonra biz aslında bağlama "idare"/"doku adı" doku hedef, ve yük doku veri içine bu hedef, ve böylece dolaylı olarak iş arkadaşı ile başa.
Ne glTexParameter
? Biz doku hedefi bağlama, ve aynı hedef ilk argüman olarak yeniden seçin. Veya doku hedefe doğru aktif doku ünitesine sahip olduğumuz sürece bağlı olması gerekmez mi?
glGenerateMipmap bir hedef üzerinde de çalışır...bu hedef başarılı olmak için hala doku adı bağlı olmalı?
Sonra bir doku ile nesne çizmek istediğimiz zaman, yapmak zorundayızher ikisi deetkin doku ünitesi ve doku bir hedef seçin? Veya doku birimi, ve sonra 4 hedefleyen birimi ile ilgili herhangi bir veri alabiliriz seçeriz? Bu beni gerçekten kafa karıştırıcı olan kısım.
CEVAP
OpenGL Nesneler Hakkında
OpenGL nesneler için standart model aşağıdaki gibidir.
Nesneleri durumu var. struct
olarak düşün. Bir nesne bu gibi tanımlanmış olabilir:
struct Object
{
int count;
float opacity;
char *name;
};
Nesnenin belirli değerler içinde saklı olan ve vardırdevlet. OpenGL nesneleri de devlet var.
Değişen Devlet
C/C , varsa bir örneğinin türü Object
değiştireceğini durumu şöyle: obj.count = 5;
ister doğrudan bir referans örneği nesne, belirli bir parçasının durumunu değiştirmek istiyorsan, götüne değer.
Sen OpenGLyokbunu yapmak.
Eski nedenleri daha iyi açıklanamayan sol için OpenGL bir nesnenin durumunu değiştirmek için, ilk gerekirbağlamabağlama. Bu glBind*
çağrı bazıları ile yapılır.
C/C aşağıdaki gibi bu eşdeğer
Object *g_objs[MAX_LOCATIONS] = {NULL};
void BindObject(int loc, Object *obj)
{
g_objs[loc] = obj;
}
Dokular ilginç; bağlama özel bir durumu temsil ediyorlar. glBind*
birçok arama "" parametresi. hedef var Bu tür nesneleri bağlı olabilir OpenGL bağlamında farklı konumları temsil eder. Örneğin, yazmak için okuma (GL_READ_FRAMEBUFFER
) veya çerçeve nesnesi (GL_WRITE_FRAMEBUFFER
) bağlayabilirsiniz. Bu OpenGL tampon nasıl kullandığını etkiler. Bu loc
parametre yukarıda temsil eder.
Dokular çünkü ne zaman özeldirilkhedef bunları bağlamak için, özel bir bilgiye sahip olmazlar. İlk ** 20, bir doku bağlamak aslında dokusunda özel durumunu ayarlarsınız. Bu doku, 2 boyutlu bir doku olduğunu söylüyorsun. Ve olacaktırher zaman2 BOYUTLU bir doku olması; bu durum değiştirilemezhiç. Eğer ilk GL_TEXTURE_2D
, bir şekilde bağımlı olduğu bir doku varsa gerekirher zamanGL_TEXTURE_2D
; GL_TEXTURE_1D
olarak bağlamaya çalışırken bir hata çalışma zamanı (süre) ortaya çıkmasına neden olacak gibi bağlayabilirsiniz.
Nesneye bağlı olduğu bir kez durumuna değiştirilebilir. Bu genel işlevleri bu nesne için belirli üzerinden yapılıyor. Onlar değiştirmek için nesneyi de temsil eden bir konum alın.
C/C , bu gibi görünüyor:
void ObjectParameteri(int loc, ObjectParameters eParam, int value)
{
if(g_objs[loc] == NULL)
return;
switch(eParam)
{
case OBJECT_COUNT:
g_objs[loc]->count = value;
break;
case OBJECT_OPACITY:
g_objs[loc]->opacity = (float)value;
break;
default:
//INVALID_ENUM error
break;
}
}
Bu işlev, şu anda loc
değer ilişkili olarak ne olursa olsun, ayarlar nasıl dikkat edin.
Nesnelerin doku, temel doku, devletin fonksiyonlarını değiştirmek için glTexParameter
. Doku durumunu değiştirme sadece diğer fonksiyonlar glTexImage
fonksiyonlar ve çeşitleri (glCompressedTexImage
, glCopyTexImage
son glTexStorage
). SubImage
çeşitli sürümleri doku içeriğini değiştirmek, ama teknik olarak onun değiştirmeyindevlet. Image
fonksiyonları doku depolama tahsis ve doku biçimini ayarlamak; SubImage
fonksiyonları sadece etrafında piksel kopyalayın. Doku devlet olarak kabul edilmez.
Tekrar etmeme izin verin: bunlarsadecedoku durumu değiştiren işlevler. glTexEnv
çevre durumu değiştirir; her şeyi doku nesnelerin içinde saklı etkilemez.
Etkin Doku
Dokular için durum daha karmaşık, daha eski nedenleri en iyi sol açıklanmayan. Bu glActiveTexture
giriyor.
Dokular için, sadece hedefleri (GL_TEXTURE_1D, GL_TEXTURE_CUBE_MAP, vb) yok. Ayrıca doku vardırbirimler. Ne var C/C örneğimiz açısından bu
Object *g_objs[MAX_OBJECTS][MAX_LOCATIONS] = {NULL};
int g_currObject = 0;
void BindObject(int loc, Object *obj)
{
g_objs[g_currObject][loc] = obj;
}
void ActiveObject(int currObject)
{
g_currObject = currObject;
}
Şimdi, biz sadece Object
s 2D bir listesi var, ama biz de geçerli bir nesne kavramı dikkat edin. Geçerli nesne ayarlamak için bir işlevi var, geçerli nesne sayısı kavramı var, ve nesne düzenleme fonksiyonları tüm geçerli nesne seçmek için ayarlanır.
Şu anda aktif nesneyi değiştirdiğinizde, hedef noktaları kümesinin tamamını değiştirin. Bağlamak için geçerli gider bir şey 0, geçerli nesne geçin nesne 4, ve tamamen farklı bir nesne değiştirme olacak.
Doku nesneleri ile bu benzetme mükemmel... neredeyse.
, glActiveTexture
bir tamsayı almaz bakın; bir zaman alırnumaralandırıcısı. Teoride GL_TEXTURE31 için GL_TEXTURE0 şey almak anlamına gelir. Ama anlaman gereken bir şey var:
BU YANLIŞTIR!
glActiveTexture
gerçek aralığı GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
tarafından yönetilir. Böyle bir uygulama sağlar eşzamanlı multitextures sayısıdır. Bu shader farklı aşamalar için farklı gruplar halinde ayrılır. GL 3 örneğin.x sınıf donanım, 16 köşe gölgelendiricisi dokular, 16 parça gölgelendirici dokular ve 16 geometri shader dokular. Bu nedenle, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
48 olacak.
Ama 48 sıralayıcısını değil. glActiveTexture
gerçekten sıralayıcısını almaz ediliyor.doğruyol glActiveTexture
aşağıdaki gibidir: Ara
glActiveTexture(GL_TEXTURE0 i);
i
0 ve GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
arasında bir sayıdır.
İşleme
Tüm bu işleme ile ne ilgisi var?
Gölgeleme kullanırken, doku görüntü birimi (i
görüntü birimi nerede glUniform1i(samplerLoc, i)
) sampler üniformalarınızı ayarlayın. glActiveTexture
ile kullanılan temsil eder. Sampler sampler Türüne göre hedef seçecek. sampler2D
** 51 * hedef seçecek. Bu numune farklı bir sebebi bu.
Şimdi bu iki GLSL numune, farklı olabilir gibi şüpheli görünüyortürleriaynı doku görüntü birimini kullanın. Ama sana değil; OpenGL bu yasaklar ve oluşturma girişimi sırasında bir hata verecektir.
Kullanır İzni arasındaki farklılıkları...
'tanımlama arasındaki fark ne ve ...
C yapı ve sınıf arasındaki farklar nel...
Nokta arasındaki fark nedir (.) operat...
`İzin ver` ve `var` swift arasındaki f...