我正在将一些遗留的 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。
任何人都可以帮忙吗?