2016-03-31 26 views
1

youtube'daki TheBennyBox tarafından 3D oyun motoru eğitim dizisini takip ediyorum. seri java'da yapıldı ve C++ gibi hesaplama hızı nedeniyle, glDrawArrays yerine glDrawElements kullanmaya başladığı # 15 seviyesine kadar dersleri takip ettim. Şu ana kadar öğreticilerde java kodunu C++ 'ya çeviriyorum ama şimdi bir şey çizebiliyorum ve opengl bana hiç hata vermiyor. problemin opengl için veriyi tamponladığından ya da opengl'in verinin nasıl arabelleğe alındığını anlattığından eminim. İşte benim kodum.Neden glDrawElements üçgenlerimi oluşturuyor?

mainGame.cpp:

init:

glClearColor(0.1f, 0.0f, 0.5f, 0.0f); 
glFrontFace(GL_CW); 
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_FRAMEBUFFER_SRGB); 

vector<Vertex> vertices; 
vertices.push_back(glm::vec3(-1, 1, 0)); 
vertices.push_back(glm::vec3(0, -0.5f, 0)); 
vertices.push_back(glm::vec3(-1, -1, 0)); 
vertices.push_back(glm::vec3(1, 1, 0)); 
vertices.push_back(glm::vec3(1, -1, 0)); 
vertices.push_back(glm::vec3(0, 0.5, 0)); 

vector<unsigned short> indices; 
indices.push_back(0); 
indices.push_back(1); 
indices.push_back(2); 
indices.push_back(3); 
indices.push_back(4); 
indices.push_back(5); 

mesh.meshInit(); 
mesh.addVerticies(vertices, indices); 
mesh.draw(); 

gameLoop:

while (_gameState != GameState::EXIT) { 
     processInput(); 
     updateScene(); 
     drawScene(); 
     if (_TEST) 
     { 
      GLenum err; 
      while ((err = glGetError()) != GL_NO_ERROR) { 
       cout << "OpenGL error: " << err << endl; 
      } 
     } 
    } 

processInput() şu anda OpenGL çizim ve updateScene (ile yapmak zorunda şey etkiler) sadece temizler Ekranı değiştirir ve bir dönüşüm nesnesini günceller, ancak sorun bu değildir. biliyorum çünkü bu bölümü yorumlamaya çalıştım ve hiçbir şey hala opengl tarafından çekilmiyor/çizilmiyor.

DrawScene: Burada

shader.bind(); 
shader.setUniform("translation", transform.getTransformation()); 
mesh.draw(); 
SDL_GL_SwapWindow(_window); 

i doğru bilgileri göndermeyeceğim inanıyoruz örgü sınıfının işlevlerini vardır.

mesh.cpp:

void Mesh::meshInit() 
{ 
    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
    glGenBuffers(1, &IBO); 
    glGenBuffers(1, &VBO); 
} 

void Mesh::addVerticies(vector<Vertex> vertices, vector<unsigned short> indices) 
{ 
    _indices = &indices[0]; 

    _vSize = vertices.size() * sizeof(float); 
    _iSize = indices.size() * sizeof(unsigned short); 

    if (_TEST) { 
     cout << "size of verticies: " << _vSize << endl; 
     cout << "size of indices: " << _iSize << endl; 
     cout << "number of verticies: " << vertices.size() << endl; 
     cout << "number of indices: " << indices.size() << endl; 
     for (int i = 0; i < vertices.size() ; i++) 
     { 
      cout << vertices[i].getPos().x << " "; 
      cout << vertices[i].getPos().y << " "; 
      cout << vertices[i].getPos().z << " "; 
      cout << "\n"; 
     } 
    }  

    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, _vSize, &vertices[0], GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, _iSize, &indices[0], GL_STATIC_DRAW); 
} 

int vertexAtribStride = Vertex::SIZE * sizeof(float); 

void Mesh::draw() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexAtribStride, 0); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 
    glDrawElements(GL_TRIANGLES, _iSize, GL_INT, _indices); 
    glDisableVertexAttribArray(0); 
} 
+4

azaltın. Her şeyi kaldırın ama sabit koordinatlarla bir üçgen çizmeye çalışın. Mükemmel, daha sonra karmaşıklık eklemek için devam edin. Bununla sorun yaşarsanız, çalışmak için çok daha kolay olacak [küçük, karşılaştırılabilir ve doğrulanabilir bir örnek] (http://stackoverflow.com/help/mcve) kodunuz olacaktır. – user4581301

cevap

2

glDrawElements üçüncü argüman GL_UNSIGNED_SHORT olmalı ve GL_ELEMENT_ARRAY_BUFFER başından mahsup edildiğinden son argüman 0 olmalıdır. Bunun dışında, Vertex :: SIZE'nin ne olduğunu bilmiyorum, ancak sadece bir özniteliğinize sahip olduğunuzdan, glVertexAttribPointer için adımı 0'a ayarlayabilirsiniz, böylece OpenGL, yalnızca onlar (yani olduklarından) sıkıca paketlendiklerini varsayarlar.

+0

"glDrawElements üçüncü argümanı GL_UNSIGNED_SHORT olmalıdır" Neye dayanarak? Geçirilen "_indices" değerinin türüyle eşleşmelidir, ancak bu verilmez. –

+0

Eh evet onlar. O, endeksleriyle yüklenen GL_ELEMENT_ARRAY_BUFFER kullanıyor mu? – bofjas

+0

Ah, bir dizin arabellek kullandığını fark etmedim. Bu durumda, son parametre tamponun başlangıcından bir ofset olmalıdır; bir ana bellek işaretçisini geçerek anlamsız ve yanlıştır. –

İlgili konular