1

UIView を OpenGL テクスチャに繰り返しレンダリングしています。デバイスは正常に動作しています (テクスチャは期待どおりに更新されます)。シミュレーターでは、テクスチャは最初は正しい (正しいアルファと色) ですが、その後のテクスチャの更新は、既存のテクスチャを置き換えるのではなく、既存のテクスチャと結合しているように見え (既存のテクスチャに「貼り付けられた」ように)、徐々に醜い混乱を引き起こします。

いくつかの(おそらく)関連するコンテキスト:

  • OpenGL ES 1.1 を使用しています
  • 2007 MBP (Radeon X1600 ビデオ) の OSX 10.6.8 で Xcode 4.0.2 (ビルド 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 (retina) に設定されている場合よりも iPhone に設定されている場合、上書きには追加の RGB ノイズがあります)

4

1 に答える 1

1

私自身も同様の問題に遭遇しました。シミュレーターとデバイスの実装に違いがある理由はわかりませんが、使用する前にピクセルバッファーがゼロになっていることを確認することでうまくいきました。ロードしているテクスチャに完全に透明なピクセルが含まれていた場合、シミュレーターではそれらのピクセルの値を設定する必要はありませんでした。

そのため、メモリを 0 に初期化する必要がある malloc の代わりに calloc を使用してみてください。つまり...

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

...またはmemset...

GLubyte *pixelBuffer = (GLubyte *)malloc(4 * width * height);
memset(pixelBuffer, 0, 4 * width * height);
于 2011-08-22T14:15:27.873 に答える