我想’我正在渲染两个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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)