3

我在一个类似于 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)};

然而,这似乎不起作用。

4

1 回答 1

0

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

于 2012-08-08T09:49:17.670 回答