我在一个类似于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)};
但这似乎不起作用。
答案 0 :(得分:0)
是否在每个帧重绘的颜色和深度缓冲区上完成glClear()?我在上面的代码中没有看到它。