跳转至内容

OpenGL 编程/从 1.x 迁移到 2.x

来自维基教科书,开放世界中的开放书籍

OpenGL ES 2.0 中大部分 OpenGL 1.x 都不可用,而 OpenGL 3.x 和 OpenGL 4.x 已弃用它们(这些特性仍然可以在“兼容性配置文件”中使用,但可以预期这些特性很快就会消失)。

但是,关于如何在新的版本中替换这些特性,人们很少提及。下面介绍如何操作。

矩阵堆栈

[编辑 | 编辑源代码]

已弃用函数:glIdentity、glRotate、glOrtho、gluOrtho...

矩阵数学运算可以完成以下操作

GLM 提供 glm::ortho 来替换 glOrtho 和 gluOrtho 以进行正交透视(和 2D 编程)。

示例

顶点和纹理

[编辑 | 编辑源代码]

已弃用函数:glVertex、glTexCoord...

这些数据现在以批处理模式作为 C 数组发送。您可以使用

  • 直接使用 C 数组:每帧重新发送数据
  • glBufferData:将 C 数据发送到显卡一次,然后引用该缓冲区

您对每个顶点属性(位置、颜色、纹理坐标...)使用 glVertexAttribPointer 一次,将 C 数组或 OpenGL 缓冲区传递给它。

示例

然后您使用 glDrawArrays 或 glDrawElements 开始绘制。

已弃用函数:glNormal、glNormalPointer

法线需要传递给着色器(主要是为了进行着色计算),就像向量坐标 (glVertexAttribPointer) 一样。要计算逆时针顺序的 3 个顶点 a、b 和 c 的法线,GLM 提供

glm::normalize(glm::cross(b - a, c - a));
glm::fastNormalize(glm::cross(b - a, c - a));  // faster but less accurate

示例

求值器 - 贝塞尔曲线和曲面

[编辑 | 编辑源代码]

已弃用函数:glMap1、glMap2、glEvalCoord、glEvalPoint...

  • GLU ES - http://code.google.com/p/glues/ - 这是针对 OpenGL 1.x 的,因此它可能无法在 2.x 环境中工作,但提供了替换代码
  • 手动代码(并不难)

示例

已弃用函数:glLight (glLightfv3 等)、glShadeModel...

坏消息是您必须在着色器中重新实现所有内容。好消息是这并不那么难,而且您可以在下面的示例中找到可以复制粘贴的代码:)

您还需要将光照参数提供给您的着色器,最好将它们存储为着色器 struct

示例

< OpenGL 编程

浏览并下载 完整代码
华夏公益教科书