CVOpenGLESTextureCache против glTexSubImage2D на iOS
Мое приложение OpenGL использует OpenGL для рендеринга текстуры в полноэкранном режиме и регулярно обновляет ее часть. Пока что яЯ использовал glTexImage2D, чтобы выдвинуть мою исходную текстуру, а затем я обновил грязные области с помощью glTexSubImage2D. Для этого ям с использованием одиночной буферизации. Это хорошо работает.
Я видел, что может быть другой способ добиться того же, используя CVOpenGLESTextureCache. Текстуры, хранящиеся в кэше текстур, ссылаются на CVPixelBuffer. Я'Я хотел бы знать, смогу ли я изменить эти кэшированные текстуры. Я пытался воссоздать CVOpenGLESTexture для каждого обновления, но это резко снижает частоту кадров (неудивительно, ведь ям не указав грязный регион нигде). Может быть, я совершенно не понял вариант использования этого кеша текстур.
Может ли кто-нибудь дать какое-нибудь руководство?
ОБНОВЛЕНИЕ: вот код, который ям с помощью. Первое обновление работает отлично. Последующие обновления нет (ничего не происходит). Между каждым обновлением я изменяю необработанное растровое изображение.
if (firstUpdate) {
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, ctx, NULL, &texCache);
CVPixelBufferRef pixelBuffer;
CVPixelBufferCreateWithBytes(NULL, width_, height_, kCVPixelFormatType_32BGRA, bitmap, width_*4, NULL, 0, NULL, &pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CVOpenGLESTextureRef texture = NULL;
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, texCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, width_, height_, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture);
texture_[0] = CVOpenGLESTextureGetName(texture);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
CVOpenGLESTextureCacheFlush(texCache, 0);
if (firstUpdate) {
glBindTexture(GL_TEXTURE_2D, texture_[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
if (firstUpdate) {
static const float textureVertices[] = {
-1.0, -1.0,
1.0, -1.0,
-1.0, 1.0,
1.0, 1.0
};
static const float textureCoords[] = {
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0
};
glVertexPointer(2, GL_FLOAT, 0, &textureVertices[0]);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords);
}
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
firstUpdate = false;