0

我正在将一些遗留的 OpenGL 代码移植到 Web 程序集(使用 emscripten)。这是使用 OpenGL 1.1

我有两种顶点格式,我在它们之间交换(取决于我是在做 2D 绘图还是 3D 绘图)。以下是两种格式:

struct Vertex2DRef
{
    float           mX;
    float           mY;
    float           mZ;
    unsigned int    mDiffuse;
    float           mTextureU;
    float           mTextureV;
};

struct Vertex2DNRef
{
    float           mX;
    float           mY;
    float           mZ;
    float           mNX;
    float           mNY;
    float           mNZ;
    float           mTextureU;
    float           mTextureV;
};

这是旧的遗留代码,所以我只是直接从内存缓冲区中提取。当我绘制 2D 时,我会这样做(不要介意 XGL 包装,它只是一个定义来报告调用是否产生错误):

        XGL(glEnableClientState(GL_VERTEX_ARRAY));
        XGL(glEnableClientState(GL_COLOR_ARRAY));
        XGL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
        XGL(glDisableClientState(GL_NORMAL_ARRAY));
        
        int aStride=sizeof(Vertex2DRef);
        Vertex2DRef* theRef=(Vertex2DRef*)theBuffer; // <- The incoming vertices are in "theBuffer"
        
        XGL(glVertexPointer(3,GL_FLOAT,aStride,&theRef->mX));
        XGL(glNormalPointer(GL_FLOAT,aStride,NULL));
        XGL(glColorPointer(4,GL_UNSIGNED_BYTE,aStride,&theRef->mDiffuse));
        XGL(glTexCoordPointer(2,GL_FLOAT,aStride,&theRef->mTextureU));
        XGL(glDrawArrays(GL_TRIANGLES,0,theTriangleCount*3));

所以上面的工作......我得到我的渲染完全符合我的预期。

但是:当我尝试绘制另一种顶点格式时,带有法线但没有漫反射的格式:

        XGL(glEnableClientState(GL_VERTEX_ARRAY));
        XGL(glDisableClientState(GL_COLOR_ARRAY));
        XGL(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
        XGL(glEnableClientState(GL_NORMAL_ARRAY));
        
        int aStride=sizeof(Vertex2DNRef);
        Vertex2DNRef* theRef=(Vertex2DNRef*)theBuffer;

        XGL(glVertexPointer(3,GL_FLOAT,aStride,&theRef->mX));
        XGL(glNormalPointer(GL_FLOAT,aStride,&theRef->mNX)  );
        XGL(glColorPointer(4,GL_UNSIGNED_BYTE,aStride,NULL));
        XGL(glTexCoordPointer(2,GL_FLOAT,aStride,&theRef->mTextureU));

        XGL(glDrawArrays(GL_TRIANGLES,0,theTriangleCount*3))

现在,我什么都得不到。该 glDrawArrays 行删除了两个错误——GL_INVALID_OPERATION 和 GL_INVALID_VALUE。文档列出的这些可能错误的原因甚至不适用(确认 theTriangleCount 不是负数,并且我根本不在程序中的任何地方使用 glBegin 或 glEnd。

任何人都可以帮忙吗?

4

0 回答 0