关于将uiview的内容转换为纹理,OpenGL es
我想将目前在屏幕上显示的uiview的内容转换为OpenGL es纹理。 但是,当我这样做时,我遇到了一些麻烦。 由OpenGL es处理的纹理的大小是输入图像的大小。 纹理渲染到屏幕上时,显示纹理内容的uview的大小已更改。
所以,如果我直接阅读uiview的内容,通过下面的代码,(_drawView属于UIView的类)
//convert current uiview to texture, opengl es
GLubyte *pixelBuffer = (GLubyte *)malloc(4 * _drawView.bounds.size.width * _drawView.bounds.size.height);
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =
CGBitmapContextCreate(pixelBuffer,
_drawView.bounds.size.width, _drawView.bounds.size.height,
8, 4* _drawView.bounds.size.width,
colourSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colourSpace);
NSLog(@"_drawView.bounds.size.width: %f", _drawView.bounds.size.width);
NSLog(@"_drawView.bounds.size.height: %f", _drawView.bounds.size.height);
[_drawView.layer renderInContext:context];
glGenBuffers(1, &_maskTexture);
glBindTexture(GL_TEXTURE_2D, _maskTexture);
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);
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA,
_drawView.bounds.size.width, _drawView.bounds.size.height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
CGContextRelease(context);
free(pixelBuffer);
_drawView.hidden = YES;
然后,_maskTexture的大小与输入图像不一样。 但是我需要保存在_maskTexture中的数据在着色器函数中进行一些计算,并使用输入图像的纹理。 但是,它们的尺寸不一样。 我怎么解决这个问题?
代码中的一个问题是您调用glGenBuffers
,它会为缓冲区生成一个对象名称。 然后使用此对象名称进行glBindTexture
调用,该调用需要纹理的名称。 您需要使用glGenTextures
来获取纹理的有效对象名称。
上一篇: about converting the content of the uiview to the texture, OpenGL es