OPENGL-ES之頂點索引繪圖

enghou123發表於2016-09-18

在學習OpenGLES時遇到一個概念,索引快取。網上查資料大部分程式碼均是針對安卓或者桌面平臺的,而且大部分的程式碼拷貝下來不能達到效果。經過幾天的努力,終於瞭解了索引繪圖的概念,所謂索引繪圖是一種在繪製大網格(mesh)時的一種可以高效繪圖的一種方式,普通的繪製三角形需要為每個三角形在array_buffer裡面分配三個頂點的位置,每個頂點至少需要sizeof(glfloat)*3的記憶體,其實在網格里面很多頂點都是共享的,也就是說不需要為重複的頂點再分配記憶體,需要找到一種方法為gpu指定繪圖時繪製哪一個點,這就是索引繪圖的用處。使用索引繪圖,array_buffer裡面的頂點會預設的根據頂點在頂點陣列裡面的位置設定索引,,我們在繪圖之前指定gpu繪圖的索引順序,當繪圖時呼叫gldrawelement(),gpu就可以按照我們指定的頂點順序繪圖.下面是程式碼片段,簡單的設定ViewController為GLKViewController並且設定self.view為GLKView就可以執行

GLKView *view = (GLKView *)self.view;
   NSAssert([view isKindOfClass:[GLKView class]],
      @"View controller's view is not a GLKView");
   
   // Create an OpenGL ES 2.0 context and provide it to the
   // view
   view.context = [[EAGLContext alloc] 
      initWithAPI:kEAGLRenderingAPIOpenGLES2];
   
   // Make the new context current
   [EAGLContext setCurrentContext:view.context];
   
   // Create a base effect that provides standard OpenGL ES 2.0
   // Shading Language programs and set constants to be used for 
   // all subsequent rendering
   self.baseEffect = [[GLKBaseEffect alloc] init];
   self.baseEffect.useConstantColor = GL_TRUE;
   self.baseEffect.constantColor = GLKVector4Make(
      1.0f, // Red
      1.0f, // Green
      1.0f, // Blue
      1.0f);// Alpha
   
   // Set the background color stored in the current context 
   glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // background color
   
   // Generate, bind, and initialize contents of a buffer to be 
   // stored in GPU memory
   glGenBuffers(1,                // STEP 1
      &vertexBufferID);
   glBindBuffer(GL_ARRAY_BUFFER,  // STEP 2
      vertexBufferID); 
   glBufferData(                  // STEP 3
      GL_ARRAY_BUFFER,  // Initialize buffer contents
      sizeof(vertices), // Number of bytes to copy
      vertices,         // Address of bytes to copy
      GL_STATIC_DRAW);  // Hint: cache in GPU memory
    
    GLuint index;
    glGenBuffers(1, &index);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexs), indexs, GL_STATIC_DRAW);


相關文章