Ric*_*ral 6 opengl vertex-buffer indices vertex-array
我试图绘制地形与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);
}
Run Code Online (Sandbox Code Playgroud)
我相信我vArray是正确的,我在绘图时使用相同的值glBegin(GL_TRIANGLE_STRIP)/glEnd,效果很好.
我的猜测是使用只的索引x坐标为每个顶点.但我不知道这是否是使用索引的正确方法glDrawElements.
我认为到目前为止一切都有意义吗?
什么不起作用是上面的位置值(我加倍检查vArray并且它们是正确的)与glDrawElements使用的不同.绘制了两个三角形,但它们比应该的大三角形.它在(-128,-128)处正确启动,但它变为类似(-125,-125)而不是(-127,-127).
我无法理解我在这里做错了什么......
使用以下内容解决了我的问题:
unsigned int indices[] = { 0, 256, 1, 257 };
Run Code Online (Sandbox Code Playgroud)
我认为可以安全地假设索引是x坐标,并且OpenGL期望y和z后面,但我们不应该自己增加3,服务器为我们做.
现在,我想一想,它上面glDrawElements有单词元素,在这种情况下是一个有3个坐标的顶点,glVertexPointer我们需要将索引传递给元素,而不是顶点.
我现在觉得这么笨
| 归档时间: |
|
| 查看次数: |
12301 次 |
| 最近记录: |