【问题标题】:Unable to draw using glDrawElements correctly无法正确使用 glDrawElements 进行绘制
【发布时间】:2016-03-07 00:33:21
【问题描述】:

我正在尝试绘制一个矩形并对其应用纹理。代码是从我正在阅读的一本书中复制的,我刚刚传递给 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::vectorsize 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 coord 和一个 texture coord, 并且索引是size 6std::vector,具有以下值: [0,1,2,2,3,0] 它在顶点数组中指定两个三角形(带有纹理)。 这两个数组总是在调用 draw 之前设置。

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

感谢您的关注。

---已编辑--- 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*/

【问题讨论】:

  • 可能是因为你的矩阵?我们可以看看你在用它们做什么吗?

标签: c++ opengl


【解决方案1】:
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)。数组的字节步长与位置和纹理坐标相同。

【讨论】:

  • 已解决,在更改原始版本时,我删除了 '*4',因为它们使用字节数组,然后转换为浮点数,我将在此浪费更多时间,谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2012-10-05
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多