编程技术分享平台

网站首页 > 技术教程 正文

opengl学习笔记(1)opengl概览(opengl入门教程(精))

xnh888 2025-03-19 17:53:32 技术教程 23 ℃ 0 评论

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。之后对这个对象的设置,都会保存到这个对象里。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表