GLPaint with GLKit:绘图时闪烁



我在一个类似于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];
纹理,

modelView投影矩阵似乎可以正常工作,因为我可以看到应用于每个点的正确纹理。

我一直在寻找调试它的方法,但我看到的一切似乎都很正常。我错过了什么吗?

谢谢!

编辑:

我想知道,当调用drawRect时,是否要在进一步绘制之前清除color_render_buffer和stencil_buffer?我的目标是保留我以前完成的绘图,并在它上面绘制其他内容。如果没有GLKit,这通常是使用kEAGLDrawablePropertyRetainedBacking完成的。我已使用以下方法将其设置在glView层上:

CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) self.glView.layer;
eaglLayer.opaque = NO;
eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @(YES)};

然而,这似乎行不通。

在每次重绘时,是否在颜色和深度缓冲区上执行 glClear()?我在上面的代码中没有看到它。

最新更新