glMapBuffer необъявленный в OpenGL-ES 2.0 - PullRequest
3 голосов
/ 04 июля 2011

Я делаю OpenGL-ES 2.0 в Ununtu 10.10 с использованием kronos и pvrsdk. Теперь код

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

========== ||||||||||||||||||||||||||||||||||| == =================

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);

Ошибка:

src/Hello.cpp: In function 'int main(int, char**)':
src/Hello.cpp:279: error: 'glMapBufferOES' was not declared in this scope
src/Hello.cpp:282: error: 'memcpy' was not declared in this scope
src/Hello.cpp:286: error: 'glUnmapBufferOES' was not declared in this scope

Я знаю, что они есть в gl2ext.h. Я включил и этот файл, но все же в его сообщении об ошибке есть что-то, чего мне не хватает, пожалуйста, скажите мне. Вы можете задать мне любой другой вопрос или информацию.

В моем glext.h:

/* GL_OES_mapbuffer */
#ifndef GL_OES_mapbuffer
#define GL_OES_mapbuffer 1
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);
GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void** params);
#endif
typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname,     void** params);
#endif

У меня уже есть это определение, которое дает эти функции как необъявленные. так что вы знаете какие-либо изменения в нем, чтобы его можно было использовать.

Ответы [ 2 ]

6 голосов
/ 04 июля 2011

Как и в «обычном» OpenGL, вы должны определить указатели функций и явно загрузить функциональность, выходящую за рамки «голых костей».

Если вы посмотрите на заголовок, вы увидите блок #ifdef GL_GLEXT_PROTOTYPES, что приводит к тому, что прототип функции не генерируется (на самом деле, я не уверен, почему вообще существует возможность генерировать прототипы, они никому не нужны).
После этого вы видите typedef, равный PFNGLMAPBUFFEROESPROC.Это то, что вам нужно.

Вам нужно будет объявить глобальный указатель на функцию, например extern PFNGLMAPBUFFEROESPROC glMapBufferOES;, и инициализировать его при запуске (после проверки наличия расширения).

Посмотрите, какие библиотекитакие как GLEW или Glee do.

(ошибка о memcpy отсутствует #include <string.h>)

1 голос
/ 28 февраля 2015

положить #include <OpenGLES/ES2/glext.h> исправил мою проблему

...