SORU
15 Ocak 2012, Pazar


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
16 Ocak 2012, PAZARTESİ


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 Objects 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011