Я выполняю следующий код C ++ в середине моей игры (все работает нормально, кроме этого), и я не запускаю его во время рендеринга:
MetaBalls::MetaBalls() : largeTexture(NULL), metaballsShader(NULL), smallTexture(NULL), smallFBO(0), largeFBO(0) {
// 1. Compile shader that will render small texture onto larger texture using blur threshold
CRender::Instance()->CreateShader("Shaders/metaballs.fs", "Shaders/metaballs.vs", &metaballsShader);
metaballsShader->_locations["projview"] = glGetUniformLocation(metaballsShader->_program, "projview");
// 4. Load the sprite that will be rendered as particles on the small texture
// TODO: batch render this
m_metaballSprite.InitSprite("Embellishments/particle.png", OFFSCREEN);
// 2. Create new texture and 2 frame buffers
// First frame buffer to render small texture, second frame buffer to scale small texture up into big one
glGenTextures(1, &smallTexture);
glBindTexture(GL_TEXTURE_2D, smallTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_OES, SMALL_TEX_W, SMALL_TEX_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// 3. Create second larger texture to contain final water textured (rendered in game as sprite)
glGenTextures(1, &largeTexture);
glBindTexture(GL_TEXTURE_2D, largeTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_OES, LARGE_TEX_W, LARGE_TEX_H, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// 5. Attach small texture to frame buffer
glGenFramebuffers(1, &smallFBO);
glBindFramebuffer(GL_FRAMEBUFFER, smallFBO);
glBindTexture(GL_TEXTURE_2D, smallTexture);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, smallTexture, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
s3eDebugErrorShow(S3E_MESSAGE_CONTINUE_STOP, "Metaballs small framebuffer incomplete");
}
// 6. Attach large texture to other frame buffer
glGenFramebuffers(1, &largeFBO);
glBindFramebuffer(GL_FRAMEBUFFER, largeFBO);
glBindTexture(GL_TEXTURE_2D, largeTexture);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, largeTexture, 0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
s3eDebugErrorShow(S3E_MESSAGE_CONTINUE_STOP, "Metaballs small framebuffer incomplete");
}
// 7. Build geometry for small frame buffer
float w = PTM_DOWNSCALE(SMALL_TEX_W);
float h = PTM_DOWNSCALE(SMALL_TEX_H);
CRender::Instance()->BuildQuad(
tVertex( b2Vec3(0,0,0), b2Vec2(0,1) ),
tVertex( b2Vec3(w,0,0), b2Vec2(1,1) ),
tVertex( b2Vec3(w,h,0), b2Vec2(1,0) ),
tVertex( b2Vec3(0,h,0), b2Vec2(0,0) ),
smallBuffer);
// 8. Build geometry for large frame buffer
w = PTM_DOWNSCALE(SMALL_TEX_W);
h = PTM_DOWNSCALE(SMALL_TEX_H);
CRender::Instance()->BuildQuad(
tVertex( b2Vec3(0,0,0), b2Vec2(0,1) ),
tVertex( b2Vec3(w,0,0), b2Vec2(1,1) ),
tVertex( b2Vec3(w,h,0), b2Vec2(1,0) ),
tVertex( b2Vec3(0,h,0), b2Vec2(0,0) ),
largeBuffer);
// return to default state
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
Моя проблема в том, что я получаю сообщение об этой ошибке от OpenGL ES 2.0:
GL Error GL_INVALID_OPERATION on entry to function glGenFramebuffers(1, 0xd8450e8)
Если я переключу порядок вышеупомянутых вызовов opengl ближе к началу функции, я могу получить GL_INVALID_OPERATION в одной из строк glGenTextures, glBindFramebuffer или даже glCreateProgram (), которая выполняется внутри первой функции CreateShader. Несмотря на текущий порядок вызовов, шейдер загружается и компилируется нормально.
Полученная ошибка нарушает задокументированные результаты этих вызовов на opengl.org, например, glGenFramebuffers должен возвращать GL_INVALID_OPERATION, только если вы передаете ненулевое значение, которое glGenFrameBuffers не вернуло. Тем не менее, я проверил целые числа, возвращенные из glGenFrameBuffers … они равны 2 и 3. Ничего плохого в них нет, так как у меня уже есть третий буфер кадров, остальное. Я также попытался сгенерировать одновременно и текстуры, и буферы кадров, но они выдают один и тот же GLuint, и возникают те же ошибки.
Любая идея, как эта ошибка может быть вызвана ?? У меня был подобный код, работающий в этом классе без проблем в прошлом.
Задача ещё не решена.
Других решений пока нет …