【问题标题】:OpenGL Add Vertices After LoadOpenGL加载后添加顶点
【发布时间】:2013-07-11 20:17:24
【问题描述】:

我在 iOS 设备上将 3D 文件解析为 OpenGL ES,在获得顶点后,我似乎无法将它们添加到包含我的顶点的 GLfloat 中。在我的文件顶部,我声明了这个 GLFloat:

    GLfloat gFileVertices[] = {
        -0.686713, 0.346845, 3.725390,          -0.000288, -0.000652, -0.000109,
        -0.677196, 0.350971, 3.675733,          -0.000288, -0.000652, -0.000109, 
        -0.673889, 0.340921, 3.726985,          -0.000288, -0.000652, -0.000109, 
        -0.677424, 0.337048, 3.775731,          -0.000283, -0.000631, -0.000071, 
        And so on...
    }

但是我怎样才能将相同的数据(x,y,z normal.x,normal.y,normal.z)放入该数组中,其中每个都是变量并且行数可变?

【问题讨论】:

  • 你想做什么?
  • 我想计算我在上面给出的示例中的数据,但是对于我的应用程序用户选择的唯一文件。所以我不明白该怎么做是在我为该文件计算数据之后获取该数据,然后将其放入 gFileVertices 变量中。问题是我必须考虑可变数量的行,如果我放置一个 for 循环来打印 gFileVertices 中计算的顶点和法线的每一行,那么我会收到一个错误,因为我不能将代码放入 gFileVertices 只有数字。
  • 你应该重新考虑你的问题标签,这与C编程比opengl更相关

标签: ios c opengl-es


【解决方案1】:

解决方案是在运行时动态分配顶点缓冲区,而不是在编译时静态分配。在您的代码中,一旦程序编译完成,就无法更改 gFileVertices 的大小。

出于管理目的,我将改为使用单独的法线和顶点数组,而不是将数据交错为一个。

要解析文件,确定顶点数并分配缓冲区。

GLfloat* verticesBuff = malloc(sizeof(GLfloat) * vertCount * 3); /* 3 floats per vert */
GLfloat* normalsBuff = malloc(sizeof(GLfloat) * vertCount * 3); /* 3 floats per vert */

然后将每个元素复制到新数组中:

  /* read from file or whatevs */
  for (int i = 0; i < vertCount; i ++)
  {
      verticesBuff[i * 3] = ... 
      verticesBuff[i * 3 + 1] = ...
      verticesBuff[i * 3 + 2] = ... 

      normalsBuff[i * 3] = ... 
      normalsBuff[i * 3 + 1] = ... 
      normalsBuff[i * 3 + 2] = ... 

  }

动态数组可以像静态一样在OpenGL中使用:

glVertexPointer(3, GL_FLOAT, 0, verticesBuff); 
glNormalPointer(GL_FLOAT, 0, normalsBuff);

就是这样!完成后请务必删除:

free(verticesBuff);
free(normalsBuff);

【讨论】:

  • 好的,但是如何为每个顶点和法线设置三个单独的浮点数?
  • @user1795671 抱歉,我犯了一个错误 - 已编辑以显示每个元素的分配方式。
  • 好的,所以如果我理解的话,我会将第一个代码 sn-p 放在我的 viewDidLoad 中,或者当我设置 openGL 时,我会在解析我的 3D 后将第二个代码与我自己的计算数据一起剪断文件,以及我的openGL设置中的第三部分,并在进入第二部分后再次调用设置,最后一个sn-p将用于在dealloc上卸载这些缓冲区?
  • @user1795671 正确 - 正是需要发生的事情!除了第三部分实际上是在使用 glDrawArrays 绘制之前。
  • 太棒了。我刚刚尝试过,我遇到了这些非常奇怪且不一致的崩溃,这些崩溃都导致了该代码,更具体地说,它总是在我设置法线的代码行崩溃,但不是一致的法线轴......你知道可能出了什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2012-05-27
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多