opengl 入门

162 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Hello 三角形

中文教程 https://learnopengl-cn.github.io/

教程 http://www.opengl-tutorial.org/cn/beginners-tutorials/tutorial-1-opening-a-window/

课程源码 https://github.com/opengl-tutorials/ogl/archive/master.zip

顶点数组对象:Vertex Array ObjectVAO
顶点缓冲对象:Vertex Buffer ObjectVBO
索引缓冲对象:Element Buffer ObjectEBOIndex Buffer ObjectIBO

图形渲染管线:可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

图形渲染管线的每个阶段示意图: 着色器(Shader) 蓝色部分代表的是我们可以注入自定义的着色器的部分。但大多数情况下,只需要配置顶点和片段着色器就行了,但也必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。

顶点属性(Vertex Attribute):坐标和颜色值 图元(Primitive): 顶点属性要表示的渲染类型。如GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP等 片段着色器:主要目的是计算一个像素的最终颜色

顶点缓冲对象(VBO):一次性发送大批顶点数据到显存(显卡的内存),供顶点着色器使用。VBO 的缓冲类型是:GL_ARRAY_BUFFER

顶点着色器类型:GL_VERTEX_SHADER 片段着色器类型:GL_FRAGMENT_SHADER 片段着色器:计算像素最后的颜色输出

  • (顶点、片段)着色器使用步骤:

      1. 使用 着色器语言GLSL(OpenGL Shading Language)编写着色器
      2. 编译着色器
      3. 使用着色器
    

着色器程序:将多个着色器进行链接,把每个着色器的输出链接到下个着色器的输入。当输出和输入不匹配的时候,会得到一个链接错误。

链接顶点属性: 在这里插入图片描述

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0); // 启用顶点属性, 0: 顶点属性位置值
0 —— 要配置的顶点属性,顶点着色器程序中location值
3 —— 顶点属性的大小
GL_FLOAT —— location值所指变量数据类型
GL_FALSE —— 是否希望数据被标准化,不希望
3 * sizeof(float) —— 步长(Stride)
(void*)0 —— 位置(location)数据在缓冲中起始位置的偏移量

顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。这使在不同顶点数据和属性配置之间切换变得非常简单,只需要绑定不同的VAO就行了。刚刚设置的所有状态都将存储在VAO中。 在这里插入图片描述

顶点数据  >  (顶点数组对象VAO标记1)顶点缓冲对象(VBO)>  设置顶点属性指针  > 顶点着色器  > 片段着色器 > 着色器程序 + 绑定之前标记1的顶点数组对象VAO > 屏幕

// ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: ..
// 1. 绑定VAO
glBindVertexArray(VAO);
// 2. 把顶点数组复制到缓冲中供OpenGL使用
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3. 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

[...]

// ..:: 绘制代码(渲染循环中) :: ..
// 4. 绘制物体
glUseProgram(shaderProgram); // 使用着色器程序
glBindVertexArray(VAO); // 使用时再次绑定VAO对象,VAO对象中存有VBO所有顶点属性。
someOpenGLFunctionThatDrawsOurTriangle(); 
// 如绘制三角形: 
// glDrawArrays(GL_TRIANGLES, 0, 3); 
// 参数含义:OpenGL图元的类型, 顶点数组的起始索引, 参与绘制的顶点个数

索引缓冲对象 索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO) 顶点数组对象VAO,可以保存顶点缓冲对象VBO的属性,也可以保存索引缓冲对象IBO的绑定状态 在这里插入图片描述

参考