现在在网上找比较系统的教程基本都是旧版OpenGL,都是基于glut的,然而这个库已经是上个世纪的了……新版的OpenGL3.3及以上的教程,强烈推荐以下这两个:
openGL tutorial http://www.opengl-tutorial.org/cn/
learn openGL https://learnopengl-cn.github.io
两份教程一个侧重理解,一个侧重代码实现,可以穿插着一起看。
另外非常感谢xuhongxu同学。
本文原发于这里,是图形学课的一次实验。
1、环境
OpenGL 3.3
GLFW,用于创建窗口和处理用户输入
GLEW,用于确定OpenGL函数的具体实现
GLM,图像相关的数学计算工具库
OSX 10.10
2、窗口和库的初始化
GLFW窗口的初始化:
if(!glfwInit())
{
return -1;
}
GLFWwindow* window;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//OpenGL版本为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//最低兼容版本
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用新版本的核心模式
glfwWindowHint(GLFW_RESIZABLE , GL_FALSE);//窗口尺寸不可变
glfwWindowHint(GLFW_SAMPLES, 4);
window = glfwCreateWindow(WIDTH, HEIGHT, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);//设为当前窗口
glfwSetKeyCallback(window, key_callback);
GLEW库的初始化:
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
glfwTerminate();
return -1;
}
3、着色器
OpenGL3.3及以上版本不再使用立即渲染模式,采用核心模式,着色器使用的语言是GLSL。核心模式的工作流程为如下图所示图形渲染管线,处理过程中一步步将3D的图形渲染成屏幕上显示的2D图像。在实验中,需要定义自己的顶点着色器(vertex shader)和片段着色器(fragment shader)。
顶点着色器定义如下:
#version 330 core
//第一层缓冲,编号为0,从C++输入数据,顶点位置
layout(location = 0) in vec3 vertexPosition_modelspace;
//第二层缓冲,编号为1,从C++输入数据,顶点颜色
layout(location = 1) in vec3 vertexColor;
//输出数据, 给片段着色器
out vec4 fragmentColor;
//全局数据,MVP矩阵
uniform mat4 MVP;
void main(