6.3OpenGLCoreProfile


6.3 OpenGL Core Profile

OpenGL有着很重的历史包袱,需要开发可编程管线新特性,还需要兼容之前固定管线。

从OpenGL3.3开始,开始使用Profiler来区分,抛弃了历史API的版本称之为Core Profile。

都2021年了,其实没有必要再兼容老旧的API。

在前面的章节,介绍的OpenGL知识都是老版本的,所以用了2.0版本在跑。

后面章节用到了新的版本API,所以后续我也使用Core Profile。

MacOS 从3.3开始只支持Core Profile。 Windows 支持OpenGL所有版本。

1. 使用Core Profile 3.3

在初始化glfw的时候需要指定OpenGL版本为3.3,然后指定为Core Profile。

//初始化OpenGL void init_opengl() { ...... glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif ...... }

2. 新的特性

从Core Profile 3.0开始,增加了顶点数组对象(Vertex Array Object,简称VAO)。

下一小节马上用到。

3. Shader语法变化

切换到OpenGL3.3 Core Profile之后,Shader语法也迎来了以下变化:

  1. #version 110 升级为 #version 330
  2. 使用关键字in 替代 attribute
  3. 使用关键字out 替代varying
  4. 采样函数从texture2D变为texture
  5. 片段着色器的输出,可以使用关键字out指定自定义变量。

下面是一个升级后的例子。

顶点着色器:

#version 330 core uniform mat4 u_mvp; layout(location = 0) in vec3 a_pos; layout(location = 1) in vec4 a_color; out vec4 v_color; void main() { gl_Position = u_mvp * vec4(a_pos, 1.0); v_color = a_color; };

片段着色器:

#version 330 core in vec4 v_color; layout(location = 0) out vec4 o_fragColor; void main() { o_fragColor = v_color; }

作者与出处
原作者: ThisisGame
来源:ThisisGame
许可证:GPL-3.0
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: ThisisGame 转发
评论区 (0)
U