gpt4 book ai didi

opengl - 用 glDrawElements 很难理解索引

转载 作者:行者123 更新时间:2023-12-04 15:15:18 25 4
gpt4 key购买 nike

我正在尝试使用 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) 。

    我不明白我在这里做错了什么......

    最佳答案

    使用类似以下内容解决了我的问题:

    unsigned int indices[] = { 0, 256, 1, 257 };

    我认为可以安全地假设索引是 x 坐标,并且 OpenGL 期望其后跟 y 和 z 但我们不应该自己增加 3,服务器会为我们做这件事。

    现在想想, glDrawElements上面有单词 element,在这种情况下,它是一个具有 3 个坐标的顶点,如 glVertexPointer 中所指定我们需要将索引传递给元素,而不是顶点。

    我现在觉得好傻...

    关于opengl - 用 glDrawElements 很难理解索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5773803/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com