opengl hello_triangle 理解 - pxqwxl/myLearnPoject GitHub Wiki
opengl使用
首先 创建一个userdata
esContext->userData = malloc ( sizeof ( UserData ) );
然后创建一个窗口
esCreateWindow ( esContext, "Hello Triangle", 320, 240, ES_WINDOW_RGB );
声明 opengl着色器代码
char vShaderStr[] =
"#version 300 es \n" //声明opengl版本
"layout(location = 0) in vec4 vPosition; \n" //取第0层的数据
"layout(location = 1) in vec3 aColor; \n" //取第1层的数据
"out vec3 vColor;\n" //输出变量vcolor
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n" //将layout 0取出的数据 赋值给gl_position
" vColor=aColor;\n" //将layout 1取出的数据 赋值给vColor
"} \n";
上述是顶点着色器代码
char fShaderStr[] =
"#version 300 es \n"
"precision mediump float; \n" //声明变量类型 设置默认精度
"out vec4 fragColor; \n" //输出变量fragcolor
"in vec3 vColor;\n" //接收输入变量 vcolor
"void main() \n"
"{ \n"
//" fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 ); \n"
" fragColor = vec4 ( vColor, 1.0 ); \n" //fragcolor赋值
"} \n";
上述是片段着色器代码 然后 创建两个着色器
vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr );
fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr );
创建一个program
programObject = glCreateProgram ( );
将programe与着色器绑定
glAttachShader ( programObject, vertexShader );
glAttachShader ( programObject, fragmentShader );
链接program
glLinkProgram ( programObject )
获取programe链接状态
glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
将userdata中的programe指向 当前programeobj esContext->userData->programObject = programObject
然后绑定回调函数 esRegisterShutdownFunc ( esContext, Shutdown ); //关闭你回调 esRegisterDrawFunc ( esContext, Draw ); //渲染回调
Draw函数中是具体的渲染逻辑
void Draw ( ESContext *esContext )
{
UserData *userData = esContext->userData;
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f,0.0f,0.0f,1.0f, //声明一个顶点数组
-0.5f, -0.5f, 0.0f,0.0f,0.0f,1.0f,
0.5f, -0.5f, 0.0f,0.0f,0.0f,1.0f,
};
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height ); //设置opengl饰扣
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT ); //清理之前的颜色
// Use the program object
glUseProgram ( userData->programObject ); //调用当前prorame
glGenBuffers(1, &VBO); // 创建一个缓冲对象 第一个参数为缓冲对象数量 第二个为缓冲区句柄 缓冲区有唯一id 缓冲对象的作用是可以存放大量数据 顶点着色器可以快速访问
//可以对缓冲区中数据进行操作
glBindBuffer(GL_ARRAY_BUFFER, VBO); //绑定当前缓冲对象
glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW); //将数据添加到当前缓冲对象(拷贝)
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 24, (void*)0 );
//使用缓冲区顶点数据 第一个参数是传入layout的id 第二个参数是顶点属性的大小是3 第三个参数是数据类型 第四个参数是是否需要标准化 第四个参数是 一组数据的长度 (当前一组数据为6 则6*4) 第五个参数是 起始位置 (0这是从头开始取数据)
该函数是指从layout 0中取数据 从第0个数据开始 取三个数据 第二组数据从第6个数据开始取 3组数据
glEnableVertexAttribArray ( 0 ); //设置顶点数据数组是否使用
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, (void*)(12));// (void*)(12)是指从第12个字符开始 即(第四个数据 3*4 = 12)即第一组数据的后三个
glEnableVertexAttribArray(1);
glDrawArrays ( GL_TRIANGLES, 0, 3 ); //执行渲染 第一个参数是渲染类型 GL_LINES GL_POINT GL_TRIANGLES 第二个参数是从第几个组顶点数据开始 第三个参数是使用几组顶点数据
}