- (BOOL)loadShaders 方法对我不起作用

Posted

技术标签:

【中文标题】- (BOOL)loadShaders 方法对我不起作用【英文标题】:- (BOOL)loadShaders method is not working for me 【发布时间】:2011-02-01 09:08:02 【问题描述】:

我正在尝试从基于视图的应用程序中使用 opengl es 2.0 制作图表,但是 - (BOOL)loadShaders 总是返回 NO,因此控制在 renderer1 中进行。知道发生了什么吗?

- (BOOL)loadShaders 
        //return YES;
    GLuint vertShader, fragShader;
    NSString *vertShaderPathname, *fragShaderPathname;

        // create shader program
    program = glCreateProgram();

        // create and compile vertex shader

    vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];  // this is returning nil always.

    if (!compileShader(&vertShader, GL_VERTEX_SHADER, 1, vertShaderPathname)) 
        destroyShaders(vertShader, fragShader, program);
        return NO;
    

        // create and compile fragment shader
    fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
    if (!compileShader(&fragShader, GL_FRAGMENT_SHADER, 1, fragShaderPathname)) 
        destroyShaders(vertShader, fragShader, program);
        return NO;
    

        // attach vertex shader to program
    glAttachShader(program, vertShader);

        // attach fragment shader to program
    glAttachShader(program, fragShader);

        // bind attribute locations
        // this needs to be done prior to linking
    glBindAttribLocation(program, ATTRIB_VERTEX, "position");
    glBindAttribLocation(program, ATTRIB_COLOR, "color");

        // link program
    if (!linkProgram(program)) 
        destroyShaders(vertShader, fragShader, program);
        return NO;
    

        // get uniform locations
    uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX] = glGetUniformLocation(program, "modelViewProjectionMatrix");

        // release vertex and fragment shaders
    if (vertShader) 
        glDeleteShader(vertShader);
        vertShader = 0;
    
    if (fragShader) 
        glDeleteShader(fragShader);
        fragShader = 0;
    

    return YES;

【问题讨论】:

YESNO 到底是什么?你自己的布尔版本? WTF。 @shoosh 这些是objective-c中内置的布尔值 【参考方案1】:

如果vertShaderPathname 为空,则表示找不到顶点着色器源。在这种情况下,请确保着色器存在于您的项目中,并且作为资源捆绑在一起。

要在 xcode 中执行此操作,请转到左侧的树,导航到“Targets->(projname)->Copy Bundle Resources”并确保您有一个“Shader.vsh”。如果它出现在“Compile Sources”中,则需要将其拖到“Copy Bundle Resources”中

【讨论】:

以上是关于- (BOOL)loadShaders 方法对我不起作用的主要内容,如果未能解决你的问题,请参考以下文章

opengl启动过程

beginSheet 方法对我不起作用

标准的 atomic bool 和 atomic flag 之间的区别

PHP 7 Bool 类型提示不起作用

为啥 '@drop' 事件在 vue 中对我不起作用?

C/C++ 高效位数组