opengl是由khronos组织维护制定的一个规范,它并不是一个库或者api,它的具体实现是由显卡厂商完成的,下面我们就来说一说关于opengl基本图形语法?我们一起去了解并探讨一下这个问题吧!
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。之后对这个对象的设置,都会保存到这个对象里。
,