opengl是由khronos组织维护制定的一个规范,它并不是一个库或者api,它的具体实现是由显卡厂商完成的,下面我们就来说一说关于opengl基本图形语法?我们一起去了解并探讨一下这个问题吧!

opengl基本图形语法(opengl学习笔记1opengl概览)

opengl基本图形语法

opengl 概述

opengl是由khronos组织维护制定的一个规范,它并不是一个库或者api,它的具体实现是由显卡厂商完成的。

opengl规范描述了绘制2D和3D图形的抽象api。

opengl规范规定了它的每个函数如何执行,以及它们的输出值,内部实现则是由opengl的开发者自行决定,通常是显卡厂商。opengl规范并没有规定实现的细节,所以不同显卡厂商的opengl有不同的实现,但其功能和结果是相匹配的。

这是opengl3.3的规范文档(https://www.khronos.org/registry/OpenGL/specs/gl/glspec33.core.pdf)

opengl的渲染模式

现代opengl(opengl3.3以后的版本)使用的是核心模式(core-profile)。早期版本使用的是立即渲染模式,也叫做固定渲染管线,而现代opengl是可编程渲染管线。

opengl的立即模式,隐藏了很多细节,绘图很方便,例如绘制一个三角形:

glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f); glEnd();

立即渲染模式下,只需要设置绘制的形状,指定顶点颜色,传入顶点即可。

而核心模式则看起来是这样的:

float vertices = { /*sth*/ }; unsigned int vao; //生成一个vao对象 glGenVertexArrays(1, &vao); //绑定vao到opengl上下文 glBindVertexArray(vao); unsigned int vbo; //生成一个vbo对象 glGenBuffers(1, &vbo); //绑定vbo到opengl上下文 glBindBuffer(GL_ARRAY_BUFFER, vbo); //把vertices里面的数据放到vbo里 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, 3);

可以看到,核心模式要比立即渲染模式更加复杂。

opengl 状态机

opengl自身是一个状态机,opengl的状态被叫做opengl上下文。例如上面的glBind函数就是改变了opengl的状态。

opengl 对象

opengl的对象可以看作一个结构体,对象被创建时,我们通过一个id来保存它的引用,接下来使用的时候,我们把这个对象绑定到opengl上下文的目标位置,例如上面例子的GL_ARRAY_BUFFER。之后对这个对象的设置,都会保存到这个对象里。

,