我无法找到正确的位置来为使用 GLKView 和 GLKViewController 的 OpenGLES 应用程序进行着色器设置。
看起来 viewDidLoad 是一个很自然的地方,但是当我在这里尝试这样做时,着色器创建失败。我的设置是这样的:
//shader helper method
int setupShaders(const char* vShader, const char* fShader); //returns a program handle
//inside GLKViewController subclass
static int program;
-(void)viewDidLoad{
[super viewDidLoad];
program = setupShaders(vsh, fsh); //program will be zero indicating setup failure
}
我知道设置代码有效,因为如果我在 -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect 中调用它,它就会成功。
所以我假设当调用 -(void)viewDidLoad 时 OpenGL 没有完全初始化,或者必须做一些事情来为我正在尝试做的设置设置正确的 OpenGL 上下文,我只是找不到任何文档关于在哪里或如何正确进行设置。
最佳答案
您是对的,最早可以轻松设置着色器的位置是drawRect
。方法。这是因为必须有一个有效的 GL 上下文当前。根据 GLKView documentation :
Before calling its drawRect: method, the view makes its EAGLContext object the current OpenGL ES context and binds its framebuffer object to the OpenGL ES context as the target for rendering commands.
因此,最简单的做法是保留一些信息,例如
program
句柄,并且仅在它非零时才初始化。if (program == 0)
program = setupShaders(vsh, fsh);
如果您不喜欢这种方法,您可以考虑使用您提供的上下文初始化您的 GLKView,或覆盖
bindDrawable
.或者您不能使用 GLKView 并手动执行操作...
关于ios - 为 GLKView 设置着色器的正确位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18596031/