美文网首页OpenGL
Learn OpenGL(二) 绘图的基本流程

Learn OpenGL(二) 绘图的基本流程

作者: 流浪的天真汉 | 来源:发表于2018-11-08 20:50 被阅读20次

    原始文章

    绘制图片的基本流程

    (1)数据准备

    创建顶点数据

    ->创建顶点数组对象(Vertex Array Object, VAO)并绑定

    glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);

    配置VAO的作用在于,绑定VAO之后,任何对顶点属性的调用都会自动保存到VAO中,这些属性包括glEnableVertexAttribArray和glDisableVertexAttribArray的调用;通过glVertexAttribPointer设置的顶点属性配置;通过glVertexAttribPointer调用进行的顶点缓冲对象与顶点属性链接。这样的好处在于,存在多个顶点时,需要调用这些顶点数据和属性时,只需要绑定缓存这些顶点数据和属性的VAO就可以了。

    ->创建顶点缓冲对象(VBO,用来在GPU内存中存储顶点)

    ->用glBindBuffer函数将新创建的缓冲绑定到GL_ARRAY_BUFFER目标上,绑定之后,使用任何在GL_ARRAY_BUFFER上的缓冲,都会调用当前绑定的缓冲(VBO)

    ->调用glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW)将定义的顶点数据vertices复制到缓冲的内存中

    ->通过函数glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0)设置顶点属性指针,即告诉openGL如何解释这些顶点数据

    ->通过函数glEnableVertexAttribArray(0);启用顶点属性(顶点属性默认是禁用的)

    ->解绑VAO,解绑后不再保存接下来的顶点属性

    (2)创建着色器程序

    着色器程序接受顶点数据,然后通过顶点着色器和片段着色器来绘制图形。

    创建顶点着色器:

    准备顶点着色器的源代码

    ->通过函数vertexShader = glCreateShader(GL_VERTEX_SHADER)创建片段着色器

    ->通过函数glShaderSource(vertexShader, 1, &vertexShaderSource, NULL)制定顶点着色器的源码

    ->通过函数glCompileShader(vertexShader);编译顶点着色器 

    ->通过函数glGetShaderiv检查编译是否成功

    创建片段着色器的过程类似:

    准备片段着色器的源代码

    ->通过函数fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)创建一个片段着色器,返回的是创建的着色器的ID,后面通过该ID操纵该着色器

    ->通过函数glShaderSource(fragmentShader, 1, &fragmentShaderSource, null);制定着色器的源代码

    ->通过函数glCompileShader(fragmentShader);编译片段着色器

    ->通过函数glGetShaderiv检查编译是否成功

    将顶点着色器和片段着色器链接生成着色器程序

    创建一个着色器程序shaderProgram = glCreateProgram();

    ->通过函数glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);指定着色器程序使用的顶点着色器和片段着色器

    ->通过函数glLinkProgram(shaderProgram);链接着色器程序

    ->通过函数glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);检查是否链接成功

    ->着色器程序生成后,顶点着色器和片段着色器不再需要,通过函数删除glDeleteShader(vertexShader);glDeleteShader(fragmentShader);

    (3)任务循环

    首先是上节说的事件检查和背景色清除

    ->选择着色器程序glUseProgram(shaderProgram);

    ->选择顶点数据glBindVertexArray(VAO);

    ->绘制图形glDrawArrays(GL_TRIANGLES, 0, 3);

    ->解绑数据glBindVertexArray(0);

    相关文章

      网友评论

        本文标题:Learn OpenGL(二) 绘图的基本流程

        本文链接:https://www.haomeiwen.com/subject/zzcgxqtx.html