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 第二个参数是从第几个组顶点数据开始 第三个参数是使用几组顶点数据 }