SORU
18 Temmuz 2011, PAZARTESİ


&; Acil modu" quot; OpenGL ne anlama geliyor?

"Acil mod"? Kod bir örnek vereyim.

Echo " modu yerine bir komut modunu kullanmak zorunda mıyım? Her yöntemi kullanarak artıları ve eksileri nelerdir?

CEVAP
18 Temmuz 2011, PAZARTESİ


Örnek; "acil mod" glVertex glBegin glEnd kullanıyor aralarında. Başka bir "acil mod" istemci köşe bir dizi (yani . glDrawArrays kullanmaktır örneği ^strong>değiltampon nesne bir tepe noktası).

Genellikle asla acil mod (sizin için belki de ilk "Merhaba işlevi kaldırılmış ve en iyi performans sunmuyor çünkü dünya" programı). dışında kullanmak isteyeceksiniz

Acil modu ideal değil nedeni grafik kartı doğrudan programın akışı ile bağlantılıdır. Sürücü olamaz GPU veri göndererek bitmiş olacak zaman bilmez, çünkü glEnd, önce işleme başlayacağım, ve bu veri de transfer için ihtiyacı olansadeceglEnd).
Benzer şekilde, bir istemci dizi köşe, sürücü sadece dizinin bir kopyası glDrawArrays ve bunu yaparken uygulamanız blok olmalı dediğiniz an çekebilir. Çünkü aksi takdirde, sürücü zorlamaktadır önce (veya ücretsiz) dizisinin bellek değiştirebilir. Bu veriler zaman içinde tam bir noktada geçerli olduğunu bilir, çünkü bu işlem, bir önceki veya sonraki bir zamanlama olamaz.

Örneğin köşe tampon bir nesne kullanırsanız bunun aksine, veri içeren bir tampon dolgu ve OpenGL ver. Süreç artık bu veri sahip ve bu nedenle artık bunu değiştirebilirsiniz. Sürücü bu gerçeği güvenebilirsiniz ve (hatta speculatively) otobüs bedava olduğu zaman bu verileri karşıya.
Eğer daha sonra herhangi bir 'glDrawArrays' veya 'glDrawElements' çağrıları işe sıraya girip hemen (aslında bitirmeden önce!) geri gelmiyor böylece program aynı zamanda sürücünün tek tek kapalı çalışır iken gönderme komutları tutar. Onlar da büyük olasılıkla sürücüsü zaten bunu çok daha önce yapabilirdi çünkü verilerin gelmesini beklemek gerekmez.
Böylece, iş parçacığı oluşturma ve GPU uyumsuz olarak çalıştırmak, her bileşen daha iyi performans verir her zaman meşgul.

Acil mod ölü basit olmanın avantajını kullanmak zorunda, ama sonra tekrar düzgün OpenGL olmayan kaldırılmış bir şekilde kullanarak tam da roket bilimi değil, sadece çok küçük bir ekstra iş alır, ya da değildir.

İşte tipik OpenGL "Merhaba" acil mod kodu: . Dünya

glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);
    glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);
    glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);
glEnd();

Düzenleme:
Ortak istek, muhafaza modunda aynı şey biraz bu gibi görünecektir:

float verts = {...};
float colors = {...};
static_assert(sizeof(verts) == sizeof(colors), "");

// not really needed for this example, but mandatory in core profile after GL 3.2
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint buf[2];
glGenBuffers(2, buf);

// assuming a layout(location = 0) for position and 
// layout(location = 1) for color in the vertex shader

// vertex positions
glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

// copy/paste for color... same code as above. A real, non-trivial program would
// normally use a single buffer for both -- usually with stride (5th param) to
// glVertexAttribPointer -- that presumes interleaving the verts and colors arrays.
// It's somewhat uglier but has better cache performance (ugly does however not
// matter for a real program, since data is loaded from a modelling-tool generated
// binary file anyway).
glBindBuffer(GL_ARRAY_BUFFER, buf[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3); 

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GamingAndTech

    GamingAndTec

    16 NİSAN 2013
  • grickle

    grickle

    22 AĞUSTOS 2006
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010