ios - 带有 GLKit 的 GLPaint : flickering when drawing

标签 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)};

但这似乎不起作用。

最佳答案

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

关于ios - 带有 GLKit 的 GLPaint : flickering when drawing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851600/

相关文章:

ios - 添加一个带有渐变颜色的调整大小的 UIButton 背景

ios - 多个命令产生 ../Debug-iphonesimulator/RA_Swift copy.app/Info.plist' : 1)

android - libgdx opengl 行质量改进

iphone - 从 EAGLView 录制的视频上传到 YouTube 时会翻转

ios - OpenGL ES 应用程序模板项目在 iOS 模拟器中崩溃

ios - 使用 CurrentUser - Parse 获取信息

ios - OpenGL ES "imperfection"

opengl-es - Android Studio NDK 错误,无法找到 GLES3/gl3.h,尽管它存在

android - 使用矩阵。在 OpenGL ES 2.0 中旋转

ios - 如果字符串值包含字符 '&',应用程序会崩溃