假设你已经对OpenGL有了基本的了解,知道OpenGL的渲染管线等。
1.创建渲染缓冲区
Gluint m_renderbuffer;//创建一个渲染缓冲区对象
glGenRenderbuffers(1, &m_renderbuffer);//创建一个渲染缓冲区对象
glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer);//将该渲染缓冲区对象绑定到管线上
2.创建帧缓冲区
Gluint m_framebuffer;//创建帧缓冲区对象
glGenFramebuffers(1, &m_framebuffer);//创建一个帧缓冲区对象
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);//将该帧缓冲区对象绑定到管线上
g lFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_renderbuffer);//将创建的渲染缓冲区绑定到帧缓冲区上,并使用颜色填充
3.设置视口的大小
glViewport(0, 0, width, height);//定义视口的大小
4.创建顶点着色器
Gluint vertexShader = glCreateShader(GL_VERTEX_SHADER);
5.创建片段着色器
Gluint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
6.指定着色器源代码
glShaderSource(vertexShader, 1, &vertexSource, 0);//source代表要执行的源代码字符串
glShaderSource(fragmentShader, 1, &fragmentSource, 0);//同上
7.编译着色器
glCompileShader(vertexShader);
g lComplieShader(fragmetnShader);
8.检查编译是否成功
GLint compileSuccess;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS,&compileSuccess);//查看编译着色器是否成功
9.如果发生错误,记录出错信息
if(compileSuccess == GL_FALSE){
GLchar message[256];
glGetShaderInfoLog(vertexShader, sizeof(message), 0, &message[0]);
std::cout <<message;
exit(1);
}
10.创建渲染源程序
10.1
Gluint programHandle = glCreateProgram();//创建一个渲程序
10.2向源程序中添加源程序
glAttachShader(programHandle, shaderHandle);
10.3链接源程序
glLinkProgram(programHandle);
10.4检查源程链接是否成功
GLint linkSuccess;
glGetProgramiv(programHandle, GL_LINK_STATUS,&linkSuccess);
if(linkSuccess == GL_FALSE){
GLchar message[256];
glGetProgramInfoLog(programHandle, sizeof(message), 0, &message[0]);
std::cout << message;
exit(1);
}
10.6顶点结构体
stuck Vertex{
float Position[2];
float Color[4];
const Vertex vertices[] = {
{{-0.5, -0.866}, {0.5, 1, 0.5, 1}},
{{0.5,-0.866},{0.2,0.6,0.5,1}},
{{0,1},{0.6,0.1,0.8,1}},
{{0.5,-0.866},{0.5,0.5,0.5,1}},
{{1.5,-0.866},{0.5,0.5,0.5,1}},
{{1.5,-0.866},{0.5,0.5,0.5,1]},
{{1,0.4},{0.5,0.5,0.5,1}}
}
10.7着色器
10.7.1顶点着色器
#define STRINGIFY(A) #A
const char * SimpleVertexShader = STRINGIFY{
attribute vec4 Position;//位置,vec4说明有4个点组成,attribute表示属性,有程序提供输入值
attribute vec4 SourceColor;//原颜色,RGBA
varying vec4 DestinationColor;//目标颜色,输出值,用来传递到片段着色器,vary表示可变输出量
uniform mat4 Projection;//投影矩阵,mat4表示一个4*4的矩阵,uniform表示统一的,不变的,每个顶点都是固定的
uniform mat Modelview;//模型矩阵
void main(void){
DestinationColor = SourceColor;//简单的将原颜色付给目标颜色
gl_Position = Projection * Modelview * Position;//通过矩阵乘法获得目标位置,gl_Position是OpenGL ES内定的值,必须指定
}
};
10.7.2片元着色器
const char * SimpleFragmentShader = STRINGIFY{
varying low vec4 DestinationColor;//由顶点着色器传入,loop表示低精度
void main(void){
gl_Fragcolor = DestinationColor;//片元颜色,g l_FragColor也是OpenGL ES内定的,必须指定
}
};
10.8开始渲染
10.8.1填充(清理)屏幕
glClearColor(0.1f, 0.9f, 0.5f, 1);//指定填充屏幕的RGBA值
g lClear(GL_COLOR_BUFFER_BIT);//指定要清除那些缓冲区,GL_COLOR_BUFFER_BIT表示颜色缓冲区,DEPTH深度 STENCIL模版
10.8.2从着色器代码中获取属性信息
GLuint m_sampleProgram = programHandle;
GLuint positionSlot = glGetAttribLocation(m_sampleProgram, "Position");
GLuint colorSlot = glGetAttribLocation(m_sampleProgram, "SourceColor")
10.8.3开启顶点属性数组
glEnableVertexAttribArray(Position);
glEnableVertexAttribArray(colorSlot);
10.8.4为着色器属性复制
GLSize stride = sizeof(Vertex);
const GLvoid *pCoords = &vertices[0].Position[0];//顶点数组中的位置数组首地址
const GLvoid *pColors = &vertices[0].Color[0];//顶点数组中的颜色数组首地址
glVertexAttributePointer(positionSlot, 2, GL_FLOAT, GL_FAULS, stride, pCoords);
glVertex AttributePointer(colorSlot,2, GL_FLOAT, GL_FAULS, stride, pColor);
10.8.5渲染顶点
glSize vertextCount = sizeof(vertices)/sizeof(vertex);//顶点的个数
glDrawArrays(GL_TRIANGLES, 0, VertexCount);
10.8.6渲染完毕,关闭顶点数组
glDisableVertexAttribArray(positionSlot);
glDisableVertexAttribArray(colorSlot);