GLPaint与GLKit:绘图时闪烁

时间:2012-08-07 18:05:50

标签: ios opengl-es opengl-es-2.0 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];

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

我一直在寻找调试方法,但我看到的一切似乎都很正常。有什么我想念的吗?

谢谢!

编辑:

我想知道,当调用drawRect时,是否需要在进一步绘制之前清除color_render_buffer和stencil_buffer?我的目标是保留我之前完成的绘图并在其上绘制其他内容。如果没有GLKit,通常使用kEAGLDrawablePropertyRetainedBacking来完成。我使用:

在glView层上设置它
CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) self.glView.layer;
eaglLayer.opaque = NO;
eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @(YES)};

但这似乎不起作用。

1 个答案:

答案 0 :(得分:0)

是否在每个帧重绘的颜色和深度缓冲区上完成glClear()?我在上面的代码中没有看到它。