我反复将UIView呈现为OpenGL纹理。事情在设备上运行良好(纹理更新如预期)。在模拟器上,纹理最初是正确的(正确的alpha和颜色)但是对纹理的后续更新似乎与现有纹理结合(就好像“粘贴”到现有纹理上)而不是替换现有纹理,逐渐产生丑陋的混乱。 / p>
一些(可能)相关背景:
以下是将视图呈现给纹理的代码(相同的代码负责初始渲染和后续更新)。
// 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);
最初我并不担心模拟器和设备之间的区别,但现在我需要使用模拟器制作教学视频。
(有趣的是,当模拟器设备设置为iPhone时,覆盖会产生额外的RGB噪声,而不是设置为iPhone(视网膜)时
答案 0 :(得分:1)
我自己也遇到过类似的问题。不知道为什么模拟器和设备之间的实现存在差异,但我发现有用的是在使用之前确保像素缓冲区为零。如果我加载的纹理具有完全透明的像素,则在模拟器上设置这些像素的值并不困难!
因此,尝试使用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);