#c #opengl #render
#c #opengl #визуализация
Вопрос:
Это продолжение моего предыдущего вопроса. В моем последнем потоке были даны ответы на все мои вопросы, но это новая ошибка, с которой я столкнулся. При рендеринге в промежуточном режиме все выглядит великолепно.
На самом деле: http://i.imgur.com/OFV6i.png
Теперь я выполняю рендеринг с помощью glDrawRangeElements() и смотрю, что происходит:
Кто-нибудь видел что-то подобное раньше? Похоже, что некоторые индексы просто находятся посередине, что вообще не имеет смысла.
Это функция, которую я использую для рендеринга моего уровня.
void WLD::renderIntermediate(GLuint* textures, long curRegion, CFrustum cfrustum)
{
// Iterate through all of the regions in the PVS
for(int i = 0; i < regions[curRegion].visibility.size(); i )
{
// Grab a visible region
int vis = regions[curRegion].visibility[i];
// Make sure it points to a mesh
if(regions[vis].meshptr == NULL)
continue;
// Make sure it is in our PVS
if(!cfrustum.BoxInFrustum(regions[vis].meshptr->minX, regions[vis].meshptr->minY, regions[vis].meshptr->minZ, regions[vis].meshptr->maxX, regions[vis].meshptr->maxY, regions[vis].meshptr->maxZ))
continue;
// Optional: Only render the region we are in (for testing)
//if(vis != curRegion)
// continue;
// Now find the ID of the zone mesh in the array
int id = regions[vis].meshptr->id;
// Figure out how many calls we will have to do to render it (different textures)
int calls = zmeshes[id].numPolyTex;
int count = 0;
// Render each call in batches
for(int j = 0; j < calls; j )
{
// Bind the correct texture
glBindTexture(GL_TEXTURE_2D, textures[zmeshes[id].polyTexs[j].texIndex]);
// Set up rendering states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
errorLog.writeSuccess("Drawing debug: ID: %i - Min: %i - Max: %i - Polys in this call %i - Count: %i - Location: %i", id, zmeshes[id].minmax[j].min, zmeshes[id].minmax[j].max, zmeshes[id].polyTexs[j].polyCount, zmeshes[id].polyTexs[j].polyCount * 3, count);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), amp;zmeshes[id].vertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), amp;zmeshes[id].vertices[0].u);
// Draw
glDrawRangeElements(GL_TRIANGLES, zmeshes[id].minmax[j].min, zmeshes[id].minmax[j].max, zmeshes[id].polyTexs[j].polyCount * 3, GL_UNSIGNED_SHORT, zmeshes[id].indices count);
// End of rendering - disable states
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
// Add the number of indices rendered
count = zmeshes[id].polyTexs[j].polyCount * 3;
}
}
}
Я сделал тонну отладочной информации, указывающей, что мои минимальные / максимальные значения настроены правильно. На данный момент я думаю, что это может быть ошибка с индексами, поэтому я собираюсь продолжить просмотр / переписать эту функцию.
Комментарии:
1. Хорошо, кажется, что все они сливаются в начале координат (0,0,0). Невероятно странно. У кого-нибудь есть какие-либо предложения?
Ответ №1:
Удалось заставить его работать. Очень благодарен, что кто-то на другом форуме точно обозначил свой вопрос, где в начале координат рисовалась третья вершина.
Кажется, мне нужно было изменить тип данных моих индексов с int на short. Работает как шарм, и я получаю увеличение кадров в секунду на 1500%.