我正在学习OpenGL,目的是为Android/iPhone构建OpenGL ES应用程序。
由于我从一开始就学习它,所以我宁愿学习新规范,而不接触旧的东西(glBegin等)。不幸的是,当我通过一些教程并实现东西时,事实证明这些示例与 ES 2.0 不兼容。例如,在这些优秀的教程之后,我知道如何实现灯光,什么在我的 PC 上有效,但在移动设备上不起作用(后者不支持gl_LightSource
)。
我想做的是在我的PC上开发代码,并将API限制为OpenGL ES支持的命令(例如,在glLight
上抛出错误)。这可能吗?
假设您使用Windows进行开发,那么您可以使用Google ANGLE将API限制为OpenGL ES 2.0。ANGLE基本上包装了DirectX,但您可以通过完全兼容的OpenGL ES 2.0接口使用它。
如果您有AMD Radeon GPU,您还有另一种选择:AMD OpenGL ES SDK 还提供完全兼容的 2.0 接口。
在这两种情况下,如果您不小心使用了非 OpenGL ES 2.0 功能,则在参数组合不受支持的情况下,代码将无法编译或在运行时失败。着色器也是如此,glCompileShader
调用将失败。
如果你想学习OpenGL ES 2并确保你只使用与OpenGL ES 2兼容的调用和技术,请考虑学习WebGL。
WebGL几乎与OpenGL ES 2相同。 你可以获得javasript控制台的优势(使用firebug或chrome的内置开发人员工具),并且在某些环境中(我认为Windows上的chrome?),每当你做错事时,你都会得到非常有用的错误消息。 除此之外,您还可以自动访问多达4个WebGL实现进行测试(Firefox,chrome,safari,opera),并且您拥有一组非常好的工具来测试OpengGL。
这基本上就是我学习OpenGL ES 2的方式。
如Mali GPU OpenGL ES Application Development Guide所述:
OpenGL ES1.1 和 OpenGL ES 2.0 是完整 OpenGL 的子集。 标准。使用 OpenGL ES API 时,存在一些限制,即您 在开发应用程序时必须注意。
例如,以下 OpenGL 功能在 OpenGL ES 1.1 或 OpenGL ES 2.0:
不支持 glBegin 或 glEnd。请改用顶点数组和顶点缓冲区对象。
唯一支持的栅格化基元是点、线和三角形。不支持四边形。
没有多项式函数求值阶段。
您不能将片段块直接发送到单个片段操作。
不支持显示列表。
此外,以下 OpenGL 功能在 OpenGL ES 2.0:
不支持固定函数图形管道。您必须使用自己的顶点和片段着色器程序。
不支持查看诸如glFrustumf之类的转换。您必须计算自己的转换矩阵,将其传递给顶点 着色器作为统一变量,并在 着色器。
不支持glVertexPointer 和 glNormalPointer 等专用函数。使用 glVertexAttribPointer 相反。
您可以随时参考 OpenGL ES 规范,查看是否支持某个功能/特性。
在 http://www.learnopengles.com/,OpenGL ES 2.0有一套很好的课程。要在PC上进行开发,您可以尝试使用模拟器;许多不同的 GPU 供应商提供自己的模拟器,将调用转换为桌面 GL。但是,确保代码按预期工作的最佳方法是在实际设备上运行它。
编辑:Android的新模拟器支持OpenGL ES 2.0:http://android-developers.blogspot.ca/2012/04/faster-emulator-with-better-hardware.html