Я пытаюсь написать простой вокселизированный двигатель местности, используя карты высот и частичный подход. Я хотел создать отдельную сетку для каждого чанка и загрузить сетки в отдельные VBO. Я подготовил всю логику, но мне кажется, что рендеринг VBO не работает должным образом. Я подготовил очень простую карту высот для тестирования, которая должна отображать только 2 строки вокселей 16x16x2 = 512 кубов по 12 треугольников в целом. Проблема в том, что мой результат выглядит совсем не так, как должен — вот что я имею в виду:
Это выглядит очень похоже, независимо от того, насколько сильно я увеличиваю или уменьшаю изображение или поворачиваю камеру, линии просто немного смещаются.
Вот как я пытаюсь это сделать:
Построение буферов для конкретной сетки, представленной классом CMesh:
void CMesh::generateVertexBufferData()
{
this->vertexBuffer = new GLuint();
glGenBuffers(1,vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, *this->vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*meshVertexData->size(),&meshVertexData[0],GL_STATIC_DRAW);
this->vertexCount = meshVertexData->size();
}
void CMesh::generateIndexBufferData()
{
this->indexBuffer = new GLuint();
glGenBuffers(1,this->indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *this->indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*meshIndexData->size(),&meshIndexData[0],GL_STATIC_DRAW);
this->indexCount = meshIndexData->size();
}
Рендеринг сделан классом GeometryManager:
glPushMatrix();
pRenderer->ImmediateColorAlpha(1.0f,1.0f,1.0f,1.0f);
pRenderer->SetRenderMode(GL_LINE);
pRenderer->TranslateWorldMatrix(geometryPosition.x*Chunk::CHUNK_SIZE,
geometryPosition.y*Chunk::CHUNK_SIZE,
geometryPosition.z*Chunk::CHUNK_SIZE);
glBindBuffer(GL_ARRAY_BUFFER,*meshArray->at(geometryID)->getBuffer(VERTEX_BUFFER));
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,*meshArray->at(geometryID)->getBuffer(INDEX_BUFFER));
glDrawElements(GL_TRIANGLES,meshArray->at(geometryID)->indexCount,GL_UNSIGNED_INT,BUFFER_OFFSET(0));
glPopMatrix();
Я проверил погоду, правильно вычисляю положения вершин, вычерчивая их в виде точек прямо из std :: vector * meshVertexData, используя простой немедленный режим, подобный следующему:
for(int i=0; i < meshArray->at(geometryID)->meshVertexData->size(); i+=3)
{
glBegin(GL_POINTS);
glVertex3f(meshArray->at(geometryID)->meshVertexData->at(i),
meshArray->at(geometryID)->meshVertexData->at(i+1),
meshArray->at(geometryID)->meshVertexData->at(i+2));
glEnd();
}
И результат, кажется, правильный.
Я полностью озадачен этим, я не уверен, что происходит между заполнением VBO данными и рендерингом, который заставляет его выглядеть так, как он. Я смиренно прошу помощи в этом вопросе, я действительно не вижу, что я делаю неправильно. Мой подход полностью ошибочен или я упускаю что-то простое?
Если кто-то серьезно заинтересован в том, чтобы помочь мне решить проблему, но ему нужно больше информации, я готов предоставить все, что вы попросите, включая полный код CMesh и GeometryManager на pastebin.
После некоторого времени отладки и тестирования предложенных решений я наконец-то нашел ошибку. Оказывается, что для std::vector
это выражение &meshVertexData[0]
не равно этому выражению &(meshVertexData->at(0))
, В результате он не правильно размещал данные в VBO. Изменил glBufferData
выделение для последнего и код работает просто отлично. Я надеюсь, что кто-то учится на моих ошибках. Спасибо всем за помощь мне с вашим пониманием!