我正在使用kronos标头在ubuntu 10.10中进行编码,但是我被卡住了,因为无论何时我尝试编译代码,都会出现错误:
glmapbuffer未声明 glunmapbuffer未声明
我的头文件中有gl2.h和gl2ext.h。任何人都可以告诉我
如果我这样做,我还能做些什么:
glBindBuffer(GL_ARRAY_BUFFER, uiVBO[surfnum]);
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat)*triNum[surfnum], NULL, GL_STATIC_DRAW);
GLfloat *pData = glMapBufferOES (GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
for(i=0; i<triNum[surfnum]; ++i,pData+=9)
{
memcpy(pData, triArray[surfnum][i].pt1, 3*sizeof(GLfloat));
memcpy(pData+3, triArray[surfnum][i].pt2, 3*sizeof(GLfloat));
memcpy(pData+6, triArray[surfnum][i].pt3, 3*sizeof(GLfloat));
}
glUnmapBufferOES (GL_ARRAY_BUFFER);//clean up behind us
答案 0 :(得分:4)
后缀…OES
表示这些函数不是核心OpenGL-ES规范的一部分,但被视为可选功能,非常类似于标准OpenGL规范中提到的…ARB
扩展。与标准OpenGL一样,访问扩展的方法(如果可用)取决于目标平台。
但是在您的情况下,由于您尝试在标准桌面Linux上进行编译,因此如果您坚持映射缓冲区,我建议采用以下解决方法。
/* before using glMapBufferOES */
#ifdef SYSTEM_HAS_STD_OPENGL
#define glMapBufferOES glMapBuffer
#define glUnmapBufferOES glUnmapBuffer
#endif
当然,您可以使用数据填充代理数组,将其提供给glBufferData
而不是映射:
glBindBuffer(GL_ARRAY_BUFFER, uiVBO[surfnum]);
size_t buf_size = 9*sizeof(GLfloat)*triNum[surfnum];
GLfloat * const pData = malloc(buf_size);
for(i=0; i<triNum[surfnum]; ++i) {
memcpy(pData+i*9, triArray[surfnum][i].pt1, 3*sizeof(GLfloat));
memcpy(pData+i*9+3, triArray[surfnum][i].pt2, 3*sizeof(GLfloat));
memcpy(pData+i*9+6, triArray[surfnum][i].pt3, 3*sizeof(GLfloat));
}
glBufferData(GL_ARRAY_BUFFER, buf_size, pData, GL_STATIC_DRAW);
free(pData);
答案 1 :(得分:0)
缓冲区对象映射的OpenGL ES 2.0 Specification状态是“不需要”。现在,ES 2.0规范是我见过的最奇怪的规范,因为它列出了“不需要”的功能。但至少,它意味着它不必存在。根据{{3}},缓冲区对象映射由GL_OES_mapbuffer扩展控制。