如何使用GLKMatrixStack?

时间:2012-04-07 10:39:00

标签: objective-c opengl-es objective-c++ glkit

我正在编写一款在屏幕上绘制多个立方体的iOS游戏,但我在定位立方体时遇到了问题。

我有一个绘制多维数据集的函数draw_voxel

void draw_voxel(Point location, Color color, GLKMatrixStackRef stack) {
  GLKMatrixStackPush(stack);
  GLKMatrixStackTranslate(stack, location.x, location.y, location.z);

  std::array<Color, 36> triangle_colors;
  triangle_colors.fill(color);

  glEnableVertexAttribArray(GLKVertexAttribPosition);
  glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_vertices.data()));
  glEnableVertexAttribArray(GLKVertexAttribColor);
  glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_colors.data()));
  glDrawArrays(GL_TRIANGLES, 0, 36);
  glDisableVertexAttribArray(GLKVertexAttribPosition);
  glDisableVertexAttribArray(GLKVertexAttribColor);

  GLKMatrixStackPop(stack);
}

我将其传递给GLKMatrixStackRef,将当前矩阵推到顶部,然后使用GLKMatrixStackTranslate翻译顶部矩阵。但是,所有立方体仍然在(0,0,0)绘制。

我这样打电话给draw_voxel

[self.effect prepareToDraw];

GLKMatrixStackRef stack = GLKMatrixStackCreate(nullptr);
draw_voxel(Point(-1.0f, 0.0f, 0.0f), Color(1.0f, 0.0f, 0.0f, 1.0f), stack);
draw_voxel(Point(+0.0f, 0.0f, 0.0f), Color(0.0f, 1.0f, 0.0f, 1.0f), stack);
draw_voxel(Point(+1.0f, 0.0f, 0.0f), Color(0.0f, 0.0f, 1.0f, 1.0f), stack);
CFRelease(stack);

我在互联网上找不到有关GLKit矩阵堆栈的任何有用信息,我真的被卡住了。如何“应用”顶部矩阵以便翻译立方体?

1 个答案:

答案 0 :(得分:1)

虽然我还没有完全掌握如何使用GLKMatrixStack,看看你的代码我认为问题是你没有将堆栈的顶部矩​​阵传递给着色器,或者用GLKit的话说,你不正确配置效果。 也许,在某些时候你应该做的事情如下:

self.effect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(stack);

希望有这个帮助,我也被困在那个堆栈上:)