OpenGL ES 2.0如何在iOS中使用不同的着色器程序绘制多个VBO

OpenGL ES 2.0如何在iOS中使用不同的着色器程序绘制多个VBO,第1张

概述我试图破解通用 Xcode iOS OpenGL游戏模板来绘制两个顶点缓冲区对象并使用不同的GLSL着色器渲染它们. 我想’我正在渲染两个VBO? (因为我在通过第一个着色器程序运行两个VBO时都看到它们)但是,我的第二个着色器似乎根本不渲染我的第二个对象. 这是两个正方形的顶点数据: GLfloat gCubeVertexData[36] = { // Data layout for 我试图破解通用 Xcode iOS OpenGL游戏模板来绘制两个顶点缓冲区对象并使用不同的GLSL着色器渲染它们.
我想’我正在渲染两个VBO? (因为我在通过第一个着色器程序运行两个VBO时都看到它们)但是,我的第二个着色器似乎根本不渲染我的第二个对象.

这是两个正方形的顶点数据:

GLfloat gCubeVertexData[36] = {    // Data layout for each line below is:    // positionX,positionY,positionZ,normalX,normalY,normalZ,0.5f,0.0f,1.0f,-0.5f,1.0f};GLfloat fooVertexData[36] = {    // Data layout for each line below is:    // positionX,normalZ    0.5f,1.0f};

这是我试图生成两个VBO并将它们绑定到数据的地方.不知道’glBindVertexArrayOES(0)’的目的是什么呢?

- (voID)setupGL{    [EAGLContext setCurrentContext:self.context];    [self loadShaders];    //---- First Vertex Array Object --------    glGenVertexArraysOES(1,&_vertexArray1);    glGenBuffers(1,&_vertexBuffer1);       glBindVertexArrayOES(_vertexArray1);    glBindBuffer(GL_ARRAY_BUFFER,_vertexBuffer1);    glBufferData(GL_ARRAY_BUFFER,sizeof(gCubeVertexData),gCubeVertexData,GL_STATIC_DRAW);    glEnabLevertexAttribarray(GLKVertexAttribposition);    glVertexAttribPointer(GLKVertexAttribposition,3,GL_float,GL_FALSE,24,BUFFER_OFFSET(0));    glEnabLevertexAttribarray(GLKVertexAttribnormal);    glVertexAttribPointer(GLKVertexAttribnormal,BUFFER_OFFSET(12));    //----- Second Vertex Array Object ----------    glGenVertexArraysOES(1,&_vertexArray2);    glGenBuffers(1,&_vertexBuffer2);    glBindVertexArrayOES(_vertexArray2);    glBindBuffer(GL_ARRAY_BUFFER,_vertexBuffer2);    glBufferData(GL_ARRAY_BUFFER,sizeof(fooVertexData),fooVertexData,BUFFER_OFFSET(12));    glBindBuffer(GL_ARRAY_BUFFER,0);    glBindVertexArrayOES(0);}

我正在使用此更新代码为模型 – 视图 – 投影矩阵设置动画:

- (voID)update{    _rotation += self.timeSinceLastUpdate * 0.2f;    float aspect = fabsf(self.vIEw.bounds.size.wIDth / self.vIEw.bounds.size.height);    GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(-1.0f,-1.0f / aspect,1.0f / aspect,-10.0f,10.0f);    GLKMatrix4 modelVIEwMatrix = GLKMatrix4MakeTranslation(0.5f,0.0f);    modelVIEwMatrix = GLKMatrix4Multiply(modelVIEwMatrix,GLKMatrix4MakeZRotation(0.0 - _rotation));    _modelVIEwProjectionMatrix = GLKMatrix4Multiply(projectionMatrix,modelVIEwMatrix);    GLKMatrix4 modelVIEwMatrix2 = GLKMatrix4MakeTranslation(-0.5f,0.0f);    modelVIEwMatrix2 = GLKMatrix4Multiply(modelVIEwMatrix2,GLKMatrix4MakeZRotation(_rotation));    _modelVIEwProjectionMatrix2 = GLKMatrix4Multiply(projectionMatrix,modelVIEwMatrix2);}

当我调用’_program2’着色器时,我看不到第二个方块:

- (voID)glkVIEw:(GLKVIEw *)vIEw drawInRect:(CGRect)rect{    glClearcolor(0.65f,0.65f,1.0f);    glClear(GL_color_BUFFER_BIT);    glBindVertexArrayOES(_vertexArray1);    glBindBuffer(GL_ARRAY_BUFFER,_vertexBuffer1);    gluseProgram(_program);    gluniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX],1,_modelVIEwProjectionMatrix.m);    glDrawArrays(GL_TRIANGLES,6);    ///////// second object and shader program:    glBindVertexArrayOES(_vertexArray2);    glBindBuffer(GL_ARRAY_BUFFER,_vertexBuffer2);    gluseProgram(_program2);    gluniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX2],_modelVIEwProjectionMatrix2.m);    glDrawArrays(GL_TRIANGLES,6);}

我基本上尝试复制加载第一个着色器的代码,加载第二个着色器.我怀疑我可能在这里做错了..但我不确定是什么:

- (BOol)loadShaders{    gluint vertShader,fragShader,vertShader2,fragShader2;    Nsstring *vertShaderPathname,*fragShaderPathname,*vertShaderPathname2,*fragShaderPathname2;    // Create shader program.    _program = glCreateProgram();    // Create and compile vertex shader.    vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];    if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {        NSLog(@"Failed to compile vertex shader");        return NO;    }    // Create and compile fragment shader.    fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];    if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {        NSLog(@"Failed to compile fragment shader");        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");    // link program.    if (![self linkProgram:_program]) {        NSLog(@"Failed to link program: %d",_program);        if (vertShader) {            glDeleteShader(vertShader);            vertShader = 0;        }        if (fragShader) {            glDeleteShader(fragShader);            fragShader = 0;        }        if (_program) {            glDeleteProgram(_program);            _program = 0;        }        return NO;    }    // Get uniform locations.    uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformlocation(_program,"modelVIEwProjectionMatrix");    // Release vertex and fragment shaders.    if (vertShader) {        glDetachShader(_program,vertShader);        glDeleteShader(vertShader);    }    if (fragShader) {        glDetachShader(_program,fragShader);        glDeleteShader(fragShader);    }    ///////////////// the second shader:    _program2 = glCreateProgram();    vertShaderPathname2 = [[NSBundle mainBundle] pathForResource:@"Shader2" ofType:@"vsh"];    if (![self compileShader:&vertShader2 type:GL_VERTEX_SHADER file:vertShaderPathname2]) {        NSLog(@"Failed to compile vertex shader2");        return NO;    }    fragShaderPathname2 = [[NSBundle mainBundle] pathForResource:@"Shader2" ofType:@"fsh"];    if (![self compileShader:&fragShader2 type:GL_FRAGMENT_SHADER file:fragShaderPathname2]) {        NSLog(@"Failed to compile fragment shader2");        return NO;    }        glAttachShader(_program2,vertShader2);        glAttachShader(_program2,fragShader2);        glBindAttribLocation(_program2,ATTRIB_VERTEX2,"position2");    if (![self linkProgram:_program2]) {        NSLog(@"Failed to link program: %d",_program2);        if (vertShader2) {            glDeleteShader(vertShader2);            vertShader2 = 0;        }        if (fragShader2) {            glDeleteShader(fragShader2);            fragShader2 = 0;        }        if (_program2) {            glDeleteProgram(_program2);            _program2 = 0;        }        return NO;    }        uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX2] = glGetUniformlocation(_program2,"modelVIEwProjectionMatrix2");    if (vertShader2) {        glDetachShader(_program2,vertShader2);        glDeleteShader(vertShader2);    }    if (fragShader2) {        glDetachShader(_program2,fragShader2);        glDeleteShader(fragShader2);    }        return YES;}- (BOol)compileShader:(gluint *)shader type:(GLenum)type file:(Nsstring *)file{    Glint status;    const GLchar *source;    source = (GLchar *)[[Nsstring stringWithContentsOffile:file enCoding:NSUTF8StringEnCoding error:nil] UTF8String];    if (!source) {        NSLog(@"Failed to load vertex shader");        return NO;    }    *shader = glCreateShader(type);    glShaderSource(*shader,&source,NulL);    glCompileShader(*shader);#if defined(DEBUG)    Glint logLength;    glGetShaderiv(*shader,GL_INFO_LOG_LENGTH,&logLength);    if (logLength > 0) {        GLchar *log = (GLchar *)malloc(logLength);        glGetShaderInfolog(*shader,logLength,&logLength,log);        NSLog(@"Shader compile log:\n%s",log);        free(log);    }#endif    glGetShaderiv(*shader,GL_COMPILE_STATUS,&status);    if (status == 0) {        glDeleteShader(*shader);        return NO;    }    return YES;}- (BOol)linkProgram:(gluint)prog{    Glint status;    gllinkProgram(prog);#if defined(DEBUG)    Glint logLength;    glGetProgramiv(prog,&logLength);    if (logLength > 0) {        GLchar *log = (GLchar *)malloc(logLength);        glGetProgramInfolog(prog,log);        NSLog(@"Program link log:\n%s",log);        free(log);    }#endif    glGetProgramiv(prog,GL_link_STATUS,&status);    if (status == 0) {        return NO;    }    return YES;}- (BOol)valIDateProgram:(gluint)prog{    Glint logLength,status;    glValIDateProgram(prog);    glGetProgramiv(prog,log);        NSLog(@"Program valIDate log:\n%s",log);        free(log);    }    glGetProgramiv(prog,GL_VALIDATE_STATUS,&status);    if (status == 0) {        return NO;    }    return YES;}

我的vert和片段着色器很简单:

// vert shader1:attribute vec4 position;uniform mat4 modelVIEwProjectionMatrix;voID main(){    gl_position = modelVIEwProjectionMatrix * position;}// vert shader2:attribute vec4 position2;uniform mat4 modelVIEwProjectionMatrix2;voID main(){    gl_position = modelVIEwProjectionMatrix2 * position2;}// frag shader(s):voID main(){    gl_Fragcolor = vec4(0.12,0.32,0.54,1.0);}
解决方法 使用OpenGL ES时最重要的一点是,您正在使用OOP语言中的过程语言.

您一次只能将一个顶点数组绑定到顶点缓冲区.

将两个顶点数组一个接一个地绑定到VBO,然后应用变换,只会转换附加到VBO的最后一个顶点数组.

在主循环中,您必须遍历顶点数组列表.对于每个顶点数组,将其绑定到VBO,然后执行任何转换.

总结

以上是内存溢出为你收集整理的OpenGL ES 2.0如何在iOS中使用不同的着色器程序绘制多个VBO全部内容,希望文章能够帮你解决OpenGL ES 2.0如何在iOS中使用不同的着色器程序绘制多个VBO所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存