无法正确使用glDrawElements绘制

时间:2016-03-07 00:33:22

标签: c++ opengl

我试图绘制一个矩形并将纹理应用到它上面。代码是从我读过的书中复制过来的,我刚刚传递给 C ++ (来自Java),现在是:

void draw(){
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 4, vertices.data());//vertexSize is 4

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 2, vertices.data() + 2);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices.data());

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}

顶点是std::vector size 16以及以下值: [-0.25,-0.25,0.0,0.25,0.25,-0.25,0.25,0.25,0.25,0.25,0.25,0.0,-0.25,0.25,0.0,0.0] 每4个浮点数指定vertex coordtexture coord, 并且索引是std::vector size 6,具有以下值: [0,1,2,2,3,0] 它指定顶点数组中的两个三角形(带纹理)。 在调用draw之前总是设置这两个数组。

问题是渲染的对象不正确,而不是我旋转了梯形的矩形。向量似乎是正确的,因为我是 OpenGL 的新手,我不知道此代码中出了什么问题。

感谢您的关注。

--- --- EDITED 在进入应用程序循环之前设置opengl矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glClearColor(0.0, 1.0, 0.0, 1.0);

glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

/*application loop, no more matrices use*/

1 个答案:

答案 0 :(得分:4)

glVertexPointer(2, GL_FLOAT, 4, vertices.data());//vertexSize is 4

是的,每个顶点有4个浮点数。但这不是第四个参数。它是从一个位置到下一个位置的字节数。那不是4;它是4 * sizeof(GLfloat)

此外:

glTexCoordPointer(2, GL_FLOAT, 2, vertices.data() + 2);

这里的第二个2也应该是4 * sizeof(GLfloat)。对于位置和纹理坐标,数组的字节步长是相同的。