【问题标题】:OpenGL ES texture combines instead of replaces (works on device, not on Simulator)OpenGL ES 纹理组合而不是替换(适用于设备,不适用于模拟器)
【发布时间】:2011-10-28 15:57:11
【问题描述】:

我反复将 UIView 渲染到 OpenGL 纹理。设备上运行良好(纹理按预期更新)。在模拟器上,纹理最初是正确的(正确的 alpha 和颜色),但随后对纹理的更新似乎与现有纹理相结合(好像“粘贴”到现有纹理上)而不是替换现有纹理,逐渐产生丑陋的混乱。

一些(可能)相关的上下文:

  • 我使用的是 OpenGL ES 1.1
  • 我在 2007 MBP(Radeon X1600 视频)的 OSX 10.6.8 上运行 Xcode 4.0.2(Build 4A2002a)
  • 项目使用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);

最初我并不担心模拟器和设备之间的区别,但是现在我需要使用模拟器制作教学视频。

(有趣的是,当模拟器设备设置为 iPhone 时,覆盖比设置为 iPhone(视网膜)时具有额外的 RGB 噪声)

【问题讨论】:

    标签: iphone opengl-es ios-simulator render-to-texture


    【解决方案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);
    

    【讨论】:

    • 谢谢,我最终将 memset 包装在条件编译指令中(请参阅 SO answer 865377)。现在它是一种享受。一旦时间限制解除,我将分配该赏金
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2011-03-08
    • 2015-02-13
    • 2011-03-20
    相关资源
    最近更新 更多