GLPaint に似たプロジェクトで GLKit に問題があります。
まず第一に、私は GLKViewController を使用していませんが、クラスに追加された GLKView のみを使用しています。
私の問題は、GLKView を描画すると、コンテンツがちらつくことです。GLKViewDelegate の drawRect への最初の呼び出しで特定のフレーム バッファーに描画していたように見え、次の呼び出しは別のフレーム バッファーであり、次の呼び出しは最初のフレーム バッファーに戻ってきました。この可能性をテストしましたが、そうです。そうではないようです。レンダリング バッファとフレーム バッファの両方がすべての図面で同じです。
これが私の描画の仕組みです(GLPaintサンプルコードに似ています):
タッチ イベントでは、renderStroke を呼び出して、描画で使用されるポイントを生成し、テクスチャを適用して線を表示します。私はカスタム シェーダーを使用しているので、これらのポイントを含むバッファーを事前に指定された場所に配置して、シェーダーがアクセスできるようにします。
// Give the vertex positions to the vertex shader
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, 0, 0, vertexBuffer);
glEnableVertexAttribArray(ATTRIB_POSITION);
次に、draw メソッドで glDrawArrays を呼び出します。
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glDrawArrays(GL_POINTS, 0, self.verticesCount);
}
GLKView を初期化する方法は次のとおりです。
self.glView = [[GLKView alloc] initWithFrame:self.frame];
self.glView.context = _context;
self.glView.delegate = self;
self.glView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
self.glView.drawableStencilFormat = GLKViewDrawableStencilFormat8;
self.glView.enableSetNeedsDisplay = NO;
self.glView.userInteractionEnabled = NO;
[self addSubview:self.glView];
すべてのポイントに適切なテクスチャが適用されていることがわかるため、テクスチャ、modelViewProjection マトリックスは適切に機能しているようです。
これをデバッグする方法を探していましたが、見たものはすべて正常に見えました。足りないものはありますか?
ありがとう!
編集:
drawRect が呼び出されたとき、さらに描画を行う前に color_render_buffer と stencil_buffer をクリアすることを意図していますか? ここでの私の目標は、以前に行った描画を保持し、その上に他のコンテンツを描画することです。GLKit がなければ、これは通常 kEAGLDrawablePropertyRetainedBacking を使用して行われます。以下を使用してglViewレイヤーに設定しました:
CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) self.glView.layer;
eaglLayer.opaque = NO;
eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @(YES)};
ただし、これは機能しないようです。