学习OpenGL:笔记一

写在前面

公司项目完结,有点闲暇时间决定学点东西。 看了下 OpenGL ,在这里做个笔记,记录下自己学习的过程。

OpenGL思路体现

  • 1、创建图层 --创建一个能把OpenGL ES的结果渲染上去的图层
  • 2、创建上下文
  • 3、清空缓冲区,这里清空缓存
  • 4、设置RenderBuffer,FrameBuffer 
  • 5、开始绘制

代码实现

  1. 创建图层
  2. 创建上下文
        self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
        if (!self.context) {
            NSLog(@"Failed to create ES context");
        }
        GLKView *view = (GLKView *)self.view;
        view.context = self.context;
        view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
        [EAGLContext setCurrentContext:self.context];
    

      

  3. 清空缓存
       glClearColor(1, 0.2, 0.2, 1);
       glClear(GL_COLOR_BUFFER_BIT);
        
  4. 设置RenderBuffer,FrameBuffer 
       program = glCreateProgram();
        const GLchar *vssource = (GLchar *)vertexShader;
        const GLchar *fssource = (GLchar *)fragmentShader;
        
        if (!compileShader(&vertShader,GL_VERTEX_SHADER, vssource)) {
            printf("Failed to compile vertex shader");
            return false;
        }
    
        if (!compileShader(&fragShader,GL_FRAGMENT_SHADER, fssource)) {
            printf("Failed to compile fragment shader");
            return false;
        }
        
        // Attach vertex shader to program.
        glAttachShader(program, vertShader);
        
        // Attach fragment shader to program.
        glAttachShader(program, fragShader);
        
        // Link program.
        if (!linkProgram(program)) {
            printf("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 false;
        }
        
        // Release vertex and fragment shaders.
        if (vertShader) {
            glDetachShader(program, vertShader);
            glDeleteShader(vertShader);
        }
        if (fragShader) {
            glDetachShader(program, fragShader);
            glDeleteShader(fragShader);
        }
        *pProgram = program;
        printf("Effect build success => %d \n", program);
    

      

  5. 开始绘制
     static GLfloat triangleData[18] = {
            0,      0.5f,  0,  0,  0.5,  0, // x, y, z, r, g, b,每一行存储一个点的信息,位置和颜色
            -0.5f, -0.5f,  0,  0,  1,  0,
            0.5f,  -0.5f,  0,  0,  0.5,  1,
        };
        GLuint positionAttribLocation = glGetAttribLocation(self.shaderProgram, "position");
        glEnableVertexAttribArray(positionAttribLocation);
        GLuint colorAttribLocation = glGetAttribLocation(self.shaderProgram, "color");
        glEnableVertexAttribArray(colorAttribLocation);
        
        // 为shader中的position和color赋值
        // glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
        // indx: 上面Get到的Location
        // size: 有几个类型为type的数据,比如位置有x,y,z三个GLfloat元素,值就为3
        // type: 一般就是数组里元素数据的类型
        // normalized: 暂时用不上
        // stride: 每一个点包含几个byte,本例中就是6个GLfloat,x,y,z,r,g,b
        // ptr: 数据开始的指针,位置就是从头开始,颜色则跳过3个GLFloat的大小
        glVertexAttribPointer(positionAttribLocation, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (char *)triangleData);
        glVertexAttribPointer(colorAttribLocation, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (char *)triangleData + 3 * sizeof(GLfloat));
        
        glDrawArrays(GL_TRIANGLES, 0, 3);
    

      

posted @ 2018-12-13 18:12  _NeverMore  阅读(244)  评论(0编辑  收藏  举报