Трудно понять индексы с glDrawElements
Я пытаюсь нарисовать местность с GL_TRIANGLE_STRIP
и glDrawElements
но мне очень трудно понять индексы, которые стоят за glDrawElements
...
вот что у меня пока есть:
void Terrain::GenerateVertexBufferObjects(float ox, float oy, float oz) {
float startWidth, startLength, *vArray;
int vCount, vIndex = -1;
// width = length = 256
startWidth = (width / 2.0f) - width;
startLength = (length / 2.0f) - length;
vCount = 3 * width * length;
vArray = new float[vCount];
for(int z = 0; z < length; z++) {
// vIndex == vIndex + width * 3 || width * 3 = 256 * 3 = 768
for(int x = 0; x < width; x++) {
vArray[++vIndex] = ox + startWidth + (x * stepWidth);
vArray[++vIndex] = oy + heights[z][x];
vArray[++vIndex] = oz + startLength + (z * stepLength);
}
}
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vCount, vArray, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Terrain::DrawVBO(unsigned int texID, float ox, float oy, float oz) {
float terrainLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };
if(!generatedVBOs) {
GenerateVertexBufferObjects(ox, oy, oz);
generatedVBOs = true;
}
unsigned int indices[] = { 0, 768, 3, 771 };
glGenBuffers(1, &indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * 4, indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexPointer(3, GL_FLOAT, 0, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, terrainLight);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
Я верю своим vArray
правильно, я использую те же значения при рисовании с glBegin(GL_TRIANGLE_STRIP)/glEnd
, который работает просто отлично.
я предполагал использовать просто индекс x
координат для каждой вершины. Но я понятия не имею, правильно ли это. используйте индексы с glDrawElements
.
- 0: индекс координаты x от первой вершины треугольника. Расположение: (-128, -128).
- 768: индекс координаты x от второй вершины треугольника. Расположение: (-128, -127)
- 3: индекс координаты x от третьей вершины треугольника. Расположение: (-127, -128)
- 771: индекс координаты x от четвертой вершины, которая нарисует второй треугольник. Расположение: (-127, -127).
Я думаю, что все имеет смысл до сих пор?
что не работает, так это то, что значения местоположения выше (которые я дважды проверил на vArray
и они верны) не то же самое, что glDrawElements
использует. Нарисованы два треугольника, но они намного больше, чем должны быть. Он начинается правильно с (-128, -128), но он переходит к чему-то вроде (-125, -125) вместо (-127, -127).
Я не могу понять, что я делаю неправильно здесь...
1 ответов
что-то вроде следующего решает мою проблему:
unsigned int indices[] = { 0, 256, 1, 257 };
Я думаю, можно с уверенностью предположить, что индекс является координатой x и что OpenGL ожидает, что за ним последуют y и z, но мы не должны увеличиваться на 3 сами, сервер делает это за нас.
и теперь, когда я думаю об этом!--1--> слово элемент на нем, который в этом случае является вершиной с 3 координатами, указанными в glVertexPointer
и нам нужно передать индексы в элемент, а не вершинный.
Теперь я чувствую себя так глупо...