绘制图片的基本流程
(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);
网友评论