创建render buffer (渲染缓冲区)
Render buffer 是OpenGL的一个对象,用于存放渲染过的图像。
- (void)setupRenderBuffer {
glGenRenderbuffers(1, &_colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}
创建一个 frame buffer(帧缓冲区)
- (void)setupFrameBuffer {
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer); // 深度测试
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer);
}深度测试
- (void)setupDepthBuffer {
glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height);
}
加载着色器
- (void)compileShaders {
// 1
GLuint vertexShader = [self compileShader:@”SimpleVertex5” withType:GL_VERTEX_SHADER];
GLuint fragmentShader = [self compileShader:@”SimpleFragment5” withType:GL_FRAGMENT_SHADER]; // 2
GLuint programHandle = glCreateProgram();
glAttachShader(programHandle, vertexShader);
glAttachShader(programHandle, fragmentShader);
glLinkProgram(programHandle); // 3 检查link状态
GLint linkSuccess;
glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE) {
} // 4 让OpenGL执行glProgramGLchar messages[256]; glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]); NSString *messageString = [NSString stringWithUTF8String:messages]; NSLog(@"link no Success-------------%@", messageString); exit(1);
glUseProgram(programHandle); // 5
_positionSlot = glGetAttribLocation(programHandle, “Position”);
_colorSlot = glGetAttribLocation(programHandle, “SourceColor”);
glEnableVertexAttribArray(_positionSlot);
glEnableVertexAttribArray(_colorSlot); // 投影
_projectionUniform = glGetUniformLocation(programHandle, “Projection”);
// 移动
_modelViewUniform = glGetUniformLocation(programHandle, “Modelview”);
}
编译着色代码
- (GLuint)compileShader:(NSString *)shaderName withType:(GLenum)shaderType {
// 1 查找shader文件
NSString *shaderPath = [[NSBundle mainBundle] pathForResource:shaderName ofType:@”glsl”];
NSFileManager *mg = [NSFileManager defaultManager]; if ([mg fileExistsAtPath:shaderPath]) {
}else{NSLog(@"ok");
} NSError *error;NSLog(@"no");
NSString *shaderString = [NSString stringWithContentsOfFile:shaderPath encoding:NSUTF8StringEncoding error:&error]; if (!shaderString) {
} // 2 创建一个代表shader的OpenGL对象, 指定vertex或fragment shaderNSLog(@"-----------Error loading shader: %@", error.localizedDescription); exit(1);
GLuint shaderHandle = glCreateShader(shaderType); // 3获取shader的source
const char *shaderStringUTF8 = [shaderString UTF8String];
int shaderStringLength = (int)[shaderString length];
glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength); // 4 编译shader
glCompileShader(shaderHandle); // 5查询shader对象的信息
GLint compileSuccess;
glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess); if (compileSuccess == GL_FALSE) {
} return shaderHandle;GLchar messages[256]; glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]); NSString *messageString = [NSString stringWithUTF8String:messages]; NSLog(@"compile no Success-----------%@", messageString); exit(1);
}清理屏幕
- (void)render {
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}绘制流程
/**- GL_ARRAY_BUFFER用于顶点数组
- 绑定vertexBuffer到GL_ARRAY_BUFFER
- 给VBO传递数据
- 取出地址
- 取出颜色
- glVertexAttribPointer的最后一个参数是要获取的参数在GL_ARRAY_BUFFER(每一个Vertex)的偏移量
- (void)setupVBOs{ GLuint verticesBuffer;
glGenBuffers(1, &verticesBuffer);
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 0);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 3);
}
b.流程代码化
一、配置渲染环境
1) 配置渲染窗口 [ 继承自 UIView ]
2) 配置渲染上下文
3) 配置帧渲染
4) 配置渲染缓存
5) 帧缓存装载渲染缓存的内容
6) 渲染上下文绑定渲染窗口(图层)
二、修改背景色
三、 初始化数据
四、 配置 OpenGL ES Shader
1) 编写 Vertex Shader Code 文件
2) 编写 Fragment Shader Code 文件
3) 配置 Vertex Shader
4) 配置 Fragment Shader
5) 创建 Shader Program
6) 装载 Vertex Shader 和 Fragment Shader
7) 链接 Shader Program
五、渲染绘制
1) 清空旧渲染缓存
2) 设置渲染窗口
3) 使用 Shder Program
4) **关联数据**
5) 绘制图形