OpenGL 编程/从 1.x 迁移到 2.x
外观
OpenGL ES 2.0 中大部分 OpenGL 1.x 都不可用,而 OpenGL 3.x 和 OpenGL 4.x 已弃用它们(这些特性仍然可以在“兼容性配置文件”中使用,但可以预期这些特性很快就会消失)。
但是,关于如何在新的版本中替换这些特性,人们很少提及。下面介绍如何操作。
已弃用函数:glIdentity、glRotate、glOrtho、gluOrtho...
矩阵数学运算可以完成以下操作
- 在着色器中使用内置运算符
- 在 C 源代码中使用额外的库,例如
GLM 提供 glm::ortho 来替换 glOrtho 和 gluOrtho 以进行正交透视(和 2D 编程)。
示例
- 教程 05:立方体旋转
已弃用函数: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
示例
- 教程 08:加载 .obj,动态计算法线
已弃用函数:glMap1、glMap2、glEvalCoord、glEvalPoint...
- GLU ES - http://code.google.com/p/glues/ - 这是针对 OpenGL 1.x 的,因此它可能无法在 2.x 环境中工作,但提供了替换代码
- 手动代码(并不难)
示例
- 教程 07:茶壶(贝塞尔曲面)
已弃用函数:glLight (glLightfv3 等)、glShadeModel...
坏消息是您必须在着色器中重新实现所有内容。好消息是这并不那么难,而且您可以在下面的示例中找到可以复制粘贴的代码:)
您还需要将光照参数提供给您的着色器,最好将它们存储为着色器 struct
。
示例
- 漫反射
- 光照教程的其他部分
浏览并下载 完整代码