我在一个类似于 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)};
然而,这似乎不起作用。