Я неоднократно рендерил UIView в текстуру OpenGL.На устройстве все работает хорошо (текстура обновляется как положено).В симуляторе текстура изначально корректна (правильная альфа и цвет), однако последующие обновления текстур, кажется, сочетаются с существующей текстурой (как будто «вставлены» в существующую текстуру) вместо замены существующей текстуры, постепенно создавая уродливый беспорядок.
Некоторый (возможно) соответствующий контекст:
- Я использую OpenGL ES 1.1
- Я использую Xcode 4.0.2 (сборка 4A2002a) на OSX 10.6.8 на MBP 2007 (видео Radeon X1600)
- В проекте используется iOS SDK 4.3, а целью развертывания является iOS 4.0
Вот код, который отображает текстуру (этот же код отвечает за первоначальный рендеринг и последующие обновления).
// render UIView to pixel buffer
GLubyte *pixelBuffer = (GLubyte *)malloc(4 * width * height);
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixelBuffer, width, height, 8, 4 * width, colourSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colourSpace);
[view.layer renderInContext:context];
// replace OpenGL texture with pixelBuffer data
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
Изначально меня не волновало различие между симулятором и устройством, однако теперь мне нужно делать обучающие видеоролики с использованием симулятора.
(что интересно, при перезаписи возникает дополнительный шум RGB, когда на устройстве-симуляторе установлено iPhone, чем на iPhoneе (сетчатка)