OpenGL ES 学习笔记四之Shader

 绘制三角形的三种方式:

OpenGL ES 学习笔记四之Shader_第1张图片

GL_TRIANGLES为单个三角形绘制模式,STRIP为两线一点确定一个相邻三角,FAN为相邻三角形的所有轮廓点。

buffer分为frame buffer和render buffer两大类,其中frame buffer相当于render buffer的管理者,frame buffer object即称为FBO,常用于做离屏渲染缓冲等。render buffer则又可分为三类,color buffer / depth buffer / stencil buffer。

- (void)setupOpenGLBuffers {

//先要renderbuffer,然后framebuffer,顺序不能互换。

// OpenGlES共有三种:colorBuffer,depthBuffer,stencilBuffer。

// 生成一个renderBuffer,id是_colorRenderBuffer

glGenRenderbuffers(1, &_renderBuffer);

// 设置为当前renderBuffer

glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

//为color renderbuffer 分配存储空间

[_glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

// FBO用于管理colorRenderBuffer,离屏渲染

glGenFramebuffers(1, &_frameBuffer);

//设置为当前framebuffer

glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);

// 将 _colorRenderBuffer 装配到 GL_COLOR_ATTACHMENT0 这个装配点上

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);

}

创建着色器程序

/**

编译Program + Vertex Shader + Fragment Shader

*/

- (void) createProgram {

//编译Vertex Shader和Fragment Shader

_glProgram = [ShaderCompileTool compileShaders:@"ShaderVertex" shaderFragment:@"ShaderFragment"];

//创建program并与Vertex Shader和Fragment Shader关联

//    glAttachShader(_glProgram, _vertexShader);

//    glAttachShader(_glProgram, _fragmentShader);

//链接program

glLinkProgram(_glProgram);

#ifdef DEBUG

GLint linkSuccess;

glGetProgramiv(_glProgram, GL_LINK_STATUS, &linkSuccess);

if (linkSuccess == GL_FALSE) {

GLchar messages[256];

glGetProgramInfoLog(_glProgram, sizeof(messages), 0, &messages[0]);

NSString *messageString = [NSString stringWithUTF8String:messages];

NSLog(@"%@", messageString);

return;

}

#endif

//开始使用program

glUseProgram(_glProgram);

//获取position的"指针"

_shaderPostionPtr = glGetAttribLocation(_glProgram, "Position");

_shaderSourceColorPtr = glGetAttribLocation(_glProgram, "SourceColor");

}


设置顶点和颜色数据

- (void)configVBOs

{

// 取出Vertices数组中的坐标点值,赋给_positionSlot

glVertexAttribPointer(_shaderPostionPtr, 3, GL_FLOAT, GL_FALSE, 0, verticesIndex);

glEnableVertexAttribArray(_shaderPostionPtr);

//注意,未使用VBO时,glVertexAttribPointer的最后一个参数是指向对应数组的指针。

//取出Colors数组中的每个坐标点的颜色值,赋给_colorSlot

glVertexAttribPointer(_shaderSourceColorPtr, 4, GL_FLOAT, GL_FALSE, 0, Colors);

glEnableVertexAttribArray(_shaderSourceColorPtr);

}

/**

绘制数据

*/

- (void) render {

// 设置清屏颜色

glClearColor(1.0f, 0.5f, 0.5f, 0.5f);

// 用来指定要用清屏颜色来清除由mask指定的buffer,此处是color buffer

glClear(GL_COLOR_BUFFER_BIT);

glViewport(0, 0, self.view.frame.size.width, self.view.frame.size.height);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

[self.glContext presentRenderbuffer:GL_RENDERBUFFER];

}

效果如下:


OpenGL ES 学习笔记四之Shader_第2张图片

你可能感兴趣的:(OpenGL ES 学习笔记四之Shader)