在glBegin()中干扰矢量

时间:2014-03-11 03:49:22

标签: c++ opengl animation

我正在尝试为分配实现代码以渲染骨架和网格动画。在我的glBegin(GL_TRIANGLES)部分中,我有一些看起来干扰我的信息的向量。

glBegin(GL_TRIANGLES);
    for (int i = 0; i < mesh->nfaces.size(); i += 1)
      for (int k = 0; k < 3; k += 1) {
          int j = k;//2 - k;

          glm::vec4 myPointPrime;

          myPointPrime.w = 1;



          myPoint.x = ecks = mesh->vertex[mesh->faces[i][j]][0];
          myPoint.y = why = mesh->vertex[mesh->faces[i][j]][1];
          myPoint.z = zed = mesh->vertex[mesh->faces[i][j]][2];



            // Stuff vvvv THIS CAUSES PROBLEMS
          for (int t = 0; t < mySkeleton->vertex.at(i).size(); t++) {
              myPointPrime += mySkeleton->vertex[i][j] * MyXformations * myPoint;
          }

          glNormal3f(mesh->normal[mesh->nfaces[i][j]][0],
                    mesh->normal[mesh->nfaces[i][j]][1],
                    mesh->normal[mesh->nfaces[i][j]][2]);


          glVertex3f(mesh->vertex[mesh->faces[i][j]][0],
                    mesh->vertex[mesh->faces[i][j]][1],
                    mesh->vertex[mesh->faces[i][j]][2]);
         // glVertex3f(myPointPrime.x, myPointPrime.y, myPointPrime.z);
         // glVertex3f(myPoint.x, myPoint.y, myPoint.z);
    }
glEnd();

myPointPrime + = ...代码对我的Vertex调用做了一些奇怪的事情,除非我注释掉for循环,否则场景不会渲染。

如果我注释掉循环,那么场景渲染,但我认为如果动画像16,000个顶点的东西将会有任何性能,我需要循环。

是否有类似自动乘以glVertex调用?

编辑:

下面是我希望应该更清楚的代码的另一个版本,而不是计算实际绘图代码中的点我改变整个网格应该遵循每帧的骨架,但没有任何渲染。

for (int vertex_i = 0; vertex_i < mesh->nfaces.size(); vertex_i++) {
    for (int k = 0; k < 3; k += 1) {
        int j = k;//2 - k;

        pointp.x = 0;
        pointp.y = 0;
        pointp.z = 0;
        for (int t = 0; t < mySkeleton->vertex.at(vertex_i).size(); t++) {
            point.x = mesh->vertex[mesh->faces[vertex_i][j]][0];
            point.y = mesh->vertex[mesh->faces[vertex_i][j]][1];
            point.z = mesh->vertex[mesh->faces[vertex_i][j]][2];

            //glPushMatrix();
            pointp += mySkeleton->vertex[vertex_i][t] * myTranslationMatrix * myRotationMatrix * point;

            cout << "PointP X: " << pointp.x << " PointP Y: " << pointp.y << " PointP Z: " << pointp.z << endl;
            mesh->vertex[mesh->faces[vertex_i][j]][0] = pointp.x;
            mesh->vertex[mesh->faces[vertex_i][j]][1] = pointp.y;
            mesh->vertex[mesh->faces[vertex_i][j]][2] = pointp.z;
            //myPointPrime += MyXformations * myPoint;
        }
    }
}

我的假设是,对于pointp的计算可能没有按照我的想法进行吗?

mySkeleton-&gt; vertex [vertex_i] [t]是来自我的'骨架'类的向量,它包含每个顶点的所有权重,每个顶点有17个权重。

“MyXformations”是从我的骨架动画函数传递的4x4矩阵,它保存最后一个已知的关键帧,并将其应用于顶点。

point是顶点中的当前点。

2 个答案:

答案 0 :(得分:0)

你的循环变量是t。但是,您在循环中引用j。在我看来,你的循环可能只会因较大的j值而崩溃。

答案 1 :(得分:0)

你没有在for循环中使用t。这是预期的吗?

mySkeleton->vertex[i][j]看起来不合格,因为j应该是mesh->faces / mesh->nfaces

此外,您可以将glNormal3fvglVertex3fv与数组一起使用。

对于超出范围的内存操作,你可以发现各种奇怪的事情,虽然我看不到任何出界的写入。您的*运营商不会修改对象吗?

如果你担心表现。您不应该使用立即模式。相反,将所有数据放在具有缓冲对象(包括连接/骨骼变换)的GPU上,并在顶点着色器中动态设置动画。

这是几年前的事,但值得一读:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch02.html