Поэтому я собираю рендерер карты высот, который будет выполнять большую часть работы в вершинном шейдере, но сначала я сгенерирую сетку для рендеринга, в настоящий момент я играю с верхними пределами openGL и C ++, чтобы увидеть насколько плотную сетку я могу визуализировать (так что позже мне есть, что сказать в плане деления сетки LoD)
ТЕМ НЕ МЕНИЕ! перейти к вопросу;
проблема, которую я заметил после тестирования meshResolution 32, 64 и 128, у меня возникли сбои во время выполнения, я остановил их, используя самодельный класс «indexFace», который содержит 6 индексов для уменьшения длины массива, проблема в разрешении 128 только На самом деле отображается третья сетка, мне было интересно, есть ли предел тому, сколько индексов openGL может визуализировать или удерживать с использованием 1 набора объектов BufferObject, или это проблема с моей обработкой стороны C ++.
Я генерирую сетку с помощью следующего:
void HeightMapMesh::GenerateMesh(GLfloat meshScale, GLushort meshResolution)
{
GLushort vertexCount = (meshResolution + 1) * (meshResolution + 1);
Vertex_Texture* vertexData = new Vertex_Texture[vertexCount];
GLushort indexCount = (meshResolution * meshResolution) * 6;
//indexFace holds 6 GLushort's in an attempt to overcome the array size limit
indexFace* indexData = new indexFace[meshResolution * meshResolution];
GLfloat scalar = meshScale / ((GLfloat)meshResolution);
GLfloat posX = 0;
GLfloat posY = 0;
for (int x = 0; x <= meshResolution; x++)
{
posX = ((GLfloat)x) * scalar;
for (int y = 0; y <= meshResolution; y++)
{
posY = ((GLfloat)y) * scalar;
vertexData[y + (x * (meshResolution + 1))] = Vertex_Texture(posX, posY, 0.0f, x, y);
}
}
GLint indexPosition;
GLint TL, TR, BL, BR;
for (int x = 0; x < meshResolution; x++)
{
for (int y = 0; y < meshResolution; y++)
{
indexPosition = (y + (x * (meshResolution)));
BL = y + (x * (meshResolution + 1));
TL = y + 1 + (x * (meshResolution + 1));
BR = y + ((x + 1) * (meshResolution + 1));
TR = y + 1 + ((x + 1) * (meshResolution + 1));
indexData[indexPosition] = indexFace(
BL, TR, TL,
BL, BR, TR
);
}
}
mesh.Fill(vertexData, vertexCount, (void *)indexData, indexCount, GL_STATIC_DRAW, GL_STATIC_DRAW);
delete [] vertexData;
delete [] indexData;
}
//This is for mesh.Fill()
void Fill(T* vertData, GLushort vertCount, void* indData, GLushort indCount, GLenum vertUsage, GLenum indUsage)
{
indexCount = indCount;
vertexCount = vertCount;
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObjectID);
glBufferData(GL_ARRAY_BUFFER, sizeof(T) * vertexCount, vertData, vertUsage);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * indexCount, indData, indUsage);
}
Это потому, что вы сделали свои шорты индексов.
Например это: GLushort indexCount = (meshResolution * meshResolution) * 6;
ударяет USHRT_MAX со значением 105 для meshResolution
, (105 * 105 * 6 = 66150> 65535)
Используйте целые числа как индексы. Поэтому везде меняйте свои индексы на целые числа без знака и выполняйте финальный колл-колл так:
glDrawElements( GL_QUADS, indCount, GL_UNSIGNED_INT, indices); //do this
//glDrawElements( GL_QUADS, indCount, GL_UNSIGNED_SHORT, indices); //instead of this
//also GL_QUADS is deprecated but it seems your data is in that format so I left it that way
Вы можете сохранить кучу индексов, если вы нарисовали GL_TRIANGLE_STRIP
Вместо этого или лучше, пока делайте тесселяцию на GPU, так как это идеальный вариант использования.