概念基础
什么是OpenGL?
OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
OpenGL规范严格规定了每个函数的执行流程,其内部的实现由OpenGL库的开发者决定,通常是显卡的生产商。
OepnGL如何执行渲染?
OpenGL本身是一个状态机(State Machine),OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。
其它
基元类型:使用OpenGL时,建议使用OpenGL定义的基元类型,GL基元类型是平台无关的。
库:最流行的几个库有GLUT,SDL,SFML和GLFW。
双缓冲(Double Buffer):图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,不会出现不真实感。
绘制一个三角形
GLFW和GLEW
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
GLEW也是一个库,它能自动识别你的平台所支持的全部OpenGL高级扩展函数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。
创建窗口
标准模板:
1 | GLFWwindow* window; |
绘制
顶点数组:
1 | GLfloat vertices[] = { |
顶点缓冲对象(Vertex Buffer Objects, VBO):
在GPU内存(通常被称为显存)中储存大量顶点,使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。
1 | GLuint VBO; |
第四个参数:
- GL_STATIC_DRAW :数据不会或几乎不会改变。
- GL_DYNAMIC_DRAW:数据会被改变很多。
- GL_STREAM_DRAW :数据每次绘制时都会改变
用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译这个着色器:
1 | GLuint vertexShader; |