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);
}
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