为什么我的第一个三角形的第三个顶点始终位于原点而其余三角形未被绘制?

时间:2014-08-04 04:43:00

标签: c opengl

我已经检查了所有内容的结果,并且我已经在我的绘图功能中整理了多个错误,但我仍然无法找到问题标题中描述的行为的原因。我使用OpenGL 1.4,3D纹理,顶点数组,纹理坐标数组和glDrawArrays从纹理(从我的纹理API)到屏幕绘制模型(从我的模型API)。通过查看所有内容(printfs)的结果,我得出结论,问题必须出在实际绘制所有内容的代码块中,而不是我的代码使用post动画顶点数据填充这些数组(所以我&#39 ; m只张贴前者以节省膨胀这个帖子。)

当前颜色用于实现每当前窗口亮度效果。在循环特征开始之前,变量msindex已设置为模型绘制规范的数量。绘制的每个模型的顶点数据和纹理坐标数据实际上都填充到一个段中,正如您在下面看到的那样,glVertexPointer和glTexCoordPointer调用它的起始位置的不同部分来注册这些数据。这个段的内容是紧密打包的,首先是顶点位置的三个浮点数,然后是纹理坐标的三个浮点数。有多重纹理(模型中最早指定了两个纹理),但两个纹理共享相同的纹理坐标(这就是为什么两个调用glTexCoordPointer指定内存中的相同位置)。 while循环用于根据miaptr段中的模型绘制规范的信息绘制每个单独的指定模型。在我的代码中,Start是在要绘制的模型的第一个顶点的整个顶点数据段中的起始6浮点宽索引,count是顶点数。在我的示例中,这些只是0表示开始,6表示计数(尝试绘制一个带有两个三角形的模型)。类型可以是多种,具体取决于模型,但在这种情况下,它是GL_TRIANGLES。我已经尝试过其他原始类型,但它们都遇到了同样的问题。此外,绘制的纹理完全不透明(和绿色),目标窗口的亮度始终为1,所有基元都是正面的。

以下是我破碎的源代码:

    /* Enable/set global things. */
    jgl.Viewport(
    (GLint) x, (GLint) y, (GLsizei) width, (GLsizei) height
    );
    fvals[0] = (jWindowsptr + jGetCurrentWindow())->brightness;
    jgl.Color4f(
    (GLfloat) fvals[0],
    (GLfloat) fvals[0],
    (GLfloat) fvals[0],
    1
    );
    jgl.Enable(GL_ALPHA_TEST);
    jgl.Enable(GL_CULL_FACE);
    jgl.CullFace(GL_BACK);
    jgl.Enable(GL_DEPTH_TEST);
    jgl.Enable(GL_POINT_SPRITE_ARB);
    jgl.EnableClientState(GL_VERTEX_ARRAY);
    const GLvoid *vaptrc = vaptr;
    jgl.VertexPointer(3, GL_FLOAT, 12, vaptrc);
    /* Color clearing is in here so I could see better while testing. */
    jgl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Enable/set per texture unit things. */
    jgl.ActiveTexture(GL_TEXTURE0 + 1);
    jgl.TexEnvi(
    GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE
    );
    jgl.ClientActiveTexture(GL_TEXTURE0 + 1);
    jgl.EnableClientState(GL_TEXTURE_COORD_ARRAY);
    jgl.TexCoordPointer(3, GL_FLOAT, 12, (vaptrc + 3));
    jgl.Enable(GL_TEXTURE_3D);
    jgl.ActiveTexture(GL_TEXTURE0);
    jgl.TexEnvi(
    GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE
    );
    jgl.ClientActiveTexture(GL_TEXTURE0);
    jgl.EnableClientState(GL_TEXTURE_COORD_ARRAY);
    jgl.TexCoordPointer(3, GL_FLOAT, 12, (vaptrc + 3));
    jgl.Enable(GL_TEXTURE_3D);

    /* Pass #1. */
    jgl.MatrixMode(GL_TEXTURE);
    jgl.DepthFunc(GL_LESS);
    jgl.AlphaFunc(GL_EQUAL, 1);
    const GLfloat *tctm;
    while (msindex > 0) {
        msindex = msindex - 1;
        jgl.ActiveTexture(GL_TEXTURE0);
        jgl.BindTexture(
        GL_TEXTURE_3D, (miaptr + msindex)->textureids[0]
        );
        if ((miaptr + msindex)->textureids[0] != 0) {
            tctm
            = (miaptr
            + msindex)->transformationmatrices[0];
            jgl.LoadMatrixf(tctm);
        }
        jgl.ActiveTexture(GL_TEXTURE0 + 1);
        jgl.BindTexture(
        GL_TEXTURE_3D, (miaptr + msindex)->textureids[1]
        );
        if ((miaptr + msindex)->textureids[1] != 0) {
            tctm
            = (miaptr
            + msindex)->transformationmatrices[1];
            jgl.LoadMatrixf(tctm);
        }
        jgl.DrawArrays(
        (miaptr + msindex)->type,
        (GLint) (miaptr + msindex)->start,
        (GLsizei) (miaptr + msindex)->count
        );
    }

    /* WIP */

    /* Disable per texture unit things. */
    jgl.ActiveTexture(GL_TEXTURE0 + 1);
    jgl.ClientActiveTexture(GL_TEXTURE0 + 1);
    jgl.DisableClientState(GL_TEXTURE_COORD_ARRAY);
    jgl.Disable(GL_TEXTURE_3D);
    jgl.ActiveTexture(GL_TEXTURE0);
    jgl.ClientActiveTexture(GL_TEXTURE0);
    jgl.DisableClientState(GL_TEXTURE_COORD_ARRAY);
    jgl.Disable(GL_TEXTURE_3D);

    /* WIP */

    /* Disable global things. */
    jgl.DisableClientState(GL_VERTEX_ARRAY);
    jgl.Disable(GL_POINT_SPRITE_ARB);
    jgl.Disable(GL_DEPTH_TEST);
    jgl.Disable(GL_CULL_FACE);
    jgl.Disable(GL_ALPHA_TEST);

1 个答案:

答案 0 :(得分:1)

您的描述表明您有交错的顶点属性,其中3个浮点数用于位置,3个浮点数用于每个顶点的纹理坐标。这也与您发布的代码相匹配。

但是,您传递给glVertexPointer()glTexCoordPointer()的值与此不匹配。每个顶点有6个浮点数(3个用于位置+ 3个用于纹理坐标),浮点数大4个字节,步幅应为6 * 4 = 24.因此所有这些调用都需要使用24作为步幅:

jgl.VertexPointer(3, GL_FLOAT, 24, vaptrc);
jgl.TexCoordPointer(3, GL_FLOAT, 24, ...);