ios - 为 GLKView 设置着色器的正确位置?

标签 ios opengl-es-2.0 glkit

我无法找到正确的位置来为使用 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/

相关文章:

ios - 如何更改 Apple 应用商店中已发布 iOS 应用的地区可用性

ios - 如何从iPhone/iPad的一个屏幕显示多个EAGLView?

iphone - iOS 中 opengl 顶点数据的对齐有多重要

android - PowerVR - glDrawElements 上的 GL_OUT_OF_MEMORY

ios - GLKViewController 和 GLKView - 第二次创建时不呈现任何内容

ios - 四元数的 Arcball 旋转(使用 iOS GLKit)

ios - 使用GLKit旋转OpenGL ES对象

ios - 如何继续添加 UIButton 并以编程方式为它们设置不同的操作?

ios - XCode 8.3.3 上的 "Show iteration count"未在相应文件上显示指示

android - 错误消息 : The "ConvertResourcesCases" task failed unexpectedly