Ответ 1
Вы можете использовать свойство слоя представления, чтобы получить CALayer и использовать renderInContext: для этого врисовать в контексте CoreGraphics. Вы можете настроить контекст CoreGraphics с выделенной вами памятью, чтобы получить буфер пикселей. Затем вы можете загрузить его в OpenGL обычным способом.
Итак: есть средства для получения содержимого пикселов UIView и OpenGL, которые будут принимать пиксельные буферы. Нет никакой конкретной связи между ними.
Некорректное кодирование, процесс будет примерно таким:
UIView *view = ... something ...;
// make space for an RGBA image of the view
GLubyte *pixelBuffer = (GLubyte *)malloc(
4 *
view.bounds.size.width *
view.bounds.size.height);
// create a suitable CoreGraphics context
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =
CGBitmapContextCreate(pixelBuffer,
view.bounds.size.width, view.bounds.size.height,
8, 4*view.bounds.size.width,
colourSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colourSpace);
// draw the view to the buffer
[view.layer renderInContext:context];
// upload to OpenGL
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA,
view.bounds.size.width, view.bounds.size.height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
// clean up
CGContextRelease(context);
free(pixelBuffer);
Это не касается проблем, связанных с нестандартными представлениями на аппаратном уровне без расширения текстуры без использования двух сторон и предполагает, что подходящее имя текстуры GL уже создано и связано. Проверяйте сами, но я думаю, что не-power-of-two поддерживается на оборудовании SGX (т.е. IPhone 3GS, iPad и все, кроме 8Gb третьего поколения iPod Touch), но не на MBX.
Самый простой способ справиться с текстурами, отличными от двух тексту, - это, вероятно, создание достаточно большой мощности двух текстур и использование glTexSubImage2D для загрузки только части из вашего исходного UIView.