glkView drawInRect没有被调用。

9
我正在学习OpenGLES,并尝试在UIViewController中放置GLKViewer。
我知道我可以通过使用GLViewController来绕过主要问题,但我想学习这种方式的操作方法。
我找到了这个问题:Nesting GLKView into UIViewControllerNested GLKView and GLKViewController 但我认为我已经按照所有正确的步骤进行操作,但当我运行我的项目时,我没有得到drawInRect打印线。
在storyboard中,我将ViewController指定为glkview组件的代理。
我尝试尽可能简化代码,并且需要帮助: MyController.h
#import <Foundation/Foundation.h>
#import <GLKit/GLKit.h>

@interface MyGLController : UIViewController <GLKViewDelegate>
{
    GLuint vertexBufferID;

}

@property (weak, nonatomic) IBOutlet GLKView *glview;

@property (strong, nonatomic) GLKBaseEffect *baseEffect;

@end

MyGLController.m

#import "MyGLController.h"

@implementation MyGLController

//@synthesize baseEffect;

-(void) viewDidLoad{
    [super viewDidLoad];

    self.glview.context = [[EAGLContext alloc] initWithAPI:
     kEAGLRenderingAPIOpenGLES2];

     [EAGLContext setCurrentContext:self.glview.context];
    printf("View Loaded");
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    printf("DrawInRect");
}

@end

* 更新 *

据我所知,glkview已按建议正确连接,并添加了josh-knapp并调用了setNeedsDisplay。

如果我漏掉了什么,请在此处上传项目的副本:https://github.com/jcrogel/OpenGLDebug.git

鉴于我的经验很浅,因此对任何愚蠢的疏忽表示歉意 :)


好的,我注意到我的问题已经被投了一个“关闭”的票和两个负面评价,但没有进一步解释是哪里出了问题或者我的问题应该如何改进。如果有任何反馈可以帮助我恢复分数,我将不胜感激。 - Juan Carlos Moreno
2
我认为投反对票的人应该解释一下他们的理由,而不是盲目地标记这个问题为关闭。显然,楼主在这里做出了努力,提供了解释和代码。一个简单的评论请求缺失信息会有所帮助。 - jdi
1
对我来说,我没有使用上下文进行初始化,这就是为什么它没有被调用的原因。 - Sam Soffes
3个回答

11

你没有说你是否在Storyboard中连接了MyGLController的glview属性,所以请确保验证。

接下来,在它加载后设置glview上下文。 没有GLKViewController,就没有任何东西告诉glview需要被绘制。确保在上下文设置完成后的某个时刻调用[self.glview setNeedsDisplay]


谢谢,我尝试了一下但没有成功。我已经更新了问题并提供了额外的信息和一个链接到我添加了项目本身的Github存储库。 - Juan Carlos Moreno
只是为了澄清,我需要执行的调用是: self.glview.setNeedsDisplay = YES; - Juan Carlos Moreno
2
应该是:self.glview.enableSetNeedsDisplay = YES; - inwit
我必须同时执行以下两个操作:self.glview.enableSetNeedsDisplay = YES; [self.glview setNeedsDisplay]; - Yahel

7

我遇到了类似的问题。

默认情况下,xcode在GLKView属性列表中将enable setNeedsDisplay复选框设置为NO
一旦我改变它,它就可以工作了。


非常感谢你,你救了我。我也遇到了同样的问题。勾选框解决了这个问题。 - Sujithra

1

我看到这个问题已经有答案了。但是我遇到了同样的问题,不过解决方法不同。我想我会在这里发布信息,以便其他人也能从中受益。

问题描述

在使用GLKView和GLKViewController时,渲染循环函数(drawInRect)只被调用一次,而后就不再被调用。

可能的原因

一些CViewController的方法实现不正确,没有调用它们的超类。以下代码演示了三个这样的函数。下面的示例正确地实现了这三个函数,并调用了它们的超类。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:NO];
}
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:NO];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接