【问题标题】:opengl 1.1 messes up at launch (randomly)opengl 1.1 在启动时搞砸了(随机)
【发布时间】:2011-11-16 21:03:09
【问题描述】:

我在 iPhone 上使用 openGL ES 1.1 时遇到了这个问题。我自己制作了 c++ 引擎,可以在 opengl 中完成所有工作,并创建一个显示渲染内容的视图。问题是有时它工作正常,有时(大多数时候)它显示混乱的视图。混乱是指不移动的对象出现在不同的位置,旋转,拉伸,场景的其他部分是好的或不可见的,没有用户交互也没有 FPS(它分解时只有一帧)。我认为这可能是因为我的深度缓冲区很糟糕。但我认为整体缓冲引擎可能很糟糕。无论如何,这些都是我的代码中的部分。

我有视图,初始化如下:

 self = [super initWithFrame:frame];
if (self) {
    CAEAGLLayer* eaglLayer = (CAEAGLLayer*) super.layer;
    eaglLayer.opaque = YES;
    
    
    m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    
    if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
        [self release];
        return nil;
    }
    
    cplusplusEngine = CreateRenderer();
    
    [m_context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];
    
    cplusplusEngine ->Initialize(CGRectGetWidth(frame), CGRectGetHeight(frame));
    
    //[self drawView: nil];
    //m_timestamp = CACurrentMediaTime();
    
    CADisplayLink* displayLink;
    displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView:)];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [displayLink setFrameInterval:1/45];
    
    [self loadUpTextures];

}

返回自我;

draw View 方法如下所示:

GLint a = cplusplusengine->Render();

[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];

现在我创建缓冲区并呈现它,我还在引擎中创建缓冲区,如下所示:

 int widthB, heightB;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_WIDTH_OES, &widthB); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES,GL_RENDERBUFFER_HEIGHT_OES, &heightB); glViewport(0, 0, widthB, heightB);
// Create a depth buffer that has the same size as the color buffer.
glGenRenderbuffersOES(1, &m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, widthB, heightB);
// Create the framebuffer object. 
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,GL_RENDERBUFFER_OES,m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

并且每一帧我都会清除颜色和深度缓冲区。现在,我确实从仪器那里收到有关该绘制视图的“当前渲染缓冲区”行的消息,它说“OpenGL ES 执行了不必要的逻辑缓冲区存储操作。这通常是由于在渲染循环开始时未清除缓冲区并且未在渲染循环结束。如果您的应用程序在每帧开始时清除深度缓冲区,它应该在每帧结束时丢弃深度缓冲区。有关更多详细信息,请参阅 EXT_discard_framebuffer 扩展。现在我正在努力解决这个问题,但我找不到解决方案。我可能在纹理中很少有可能发生这种情况的地方。至少找出为什么 opengl 可能会变得混乱会很有帮助。

附:我确实在该视图中加载纹理并将它们设置在这样的引擎中。 engineTexture[index] = viewsTextureValueAt[index];这只是将 GLuint 从视图纹理指针设置为引擎纹理指针。我可以这样做吗?它有效,但我不知道是否是这种情况。即使我注释掉所有纹理用法,我也会收到错误。

【问题讨论】:

  • 我尝试禁用所有纹理,删除所有纹理绑定并使代码无纹理,但问题仍然存在...我将所有组件设置为不同颜色,所以现在,我看到的不是按钮,而是彩色方块在错误的位置。虽然我必须说,有五个正方形,它们画得很好,但是当这个错误出现时,其中一个按钮就会被弄乱。

标签: iphone ios ipad opengl-es buffer


【解决方案1】:

我自己设法解决了这个问题。看来我的缓冲区一切正常。我的质地也很好。错误在于一个简单的“新手常见错误”。我使用很少的变量来操纵和对齐我的所有场景。似乎当我在objective-c中使用这些变量而不首先将值定义为零时,编译器以某种方式为它们分配了0,但是现在,当我使用c ++引擎时,我现在没有定义的所有变量都得到了随机值,这使我的应用程序以不同的方式随机崩溃。例如,我的按钮对齐数组仅设置为最后 4 个按钮,第一个位于 0 位置,所以我未定义该数字,这就是为什么每次启动时该按钮都会飞到某个地方。一次值得到 1700000+ 另一个 -0.000056+ 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2010-09-05
    相关资源
    最近更新 更多