Текстура OpenGL ES объединяет вместо замен (работает на устройстве, а не на симуляторе) - PullRequest
1 голос
/ 17 августа 2011

Я неоднократно рендерил 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е (сетчатка)

1 Ответ

1 голос
/ 22 августа 2011

Я столкнулся с подобной проблемой сам. Не знаю, почему существует разница в реализации между симулятором и устройством, но я обнаружил, что сработал, чтобы убедиться, что буфер пикселей был обнулен перед его использованием. Если у текстуры, которую я загружал, были полностью прозрачные пиксели, то на симуляторе не удосуживалось установить значения для этих пикселей!

Итак, попробуйте использовать calloc вместо malloc, что должно инициализировать память до 0 с. то есть что-то вроде ...

GLubyte *pixelBuffer = (GLubyte *)calloc(4 * width * height, sizeof(GLubyte));

... или memset ...

GLubyte *pixelBuffer = (GLubyte *)malloc(4 * width * height);
memset(pixelBuffer, 0, 4 * width * height);
...