我正在尝试使用
我相信我的
我的猜测是只使用
以下是每个顶点的位置和
问题在于上面的位置值(我已经在
我无法理解我在这里做错了什么...
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
的正确方法。以下是每个顶点的位置和
x
坐标的索引:
- 0:三角形第一个顶点的
x
坐标的索引。位置:(-128, -128)。 - 768:三角形第二个顶点的
x
坐标的索引。位置:(-128, -127)。 - 3:三角形第三个顶点的
x
坐标的索引。位置:(-127, -128)。 - 771:将绘制第二个三角形的第四个顶点的
x
坐标的索引。位置:(-127, -127)。
问题在于上面的位置值(我已经在
vArray
中进行了双重检查,并且它们是正确的)与glDrawElements
使用的不同。两个三角形被绘制出来,但它们比应该的要大得多。它从(-128, -128)开始,但是它到达了(-125, -125),而不是(-127, -127)。我无法理解我在这里做错了什么...
glBegin/glEnd
中使用过索引,所以我不知道,我直接将坐标传递给glVertex
。我对任何事情都不确定,我只是开始学习VBO,并且缺乏示例。 - rfgamaral