Opengl 同一程序,以Open GL和Open GL ES 2.0为目标

Opengl 同一程序,以Open GL和Open GL ES 2.0为目标,opengl,opengl-es,raspberry-pi,opengl-es-2.0,Opengl,Opengl Es,Raspberry Pi,Opengl Es 2.0,如果该程序仅执行2D加速渲染,那么是否可以在“桌面”OpenGL和OpenGL ES 2.0平台上运行相同的程序(未经修改) 一台普通的Windows桌面PC和Raspberry Pi将运行该程序。 GL上下文是通过优秀的SDL2库提供的函数获得的。对于绘图例程,将使用纹理图集 如果一个程序可以在PC上开发/调试,然后简单地重新编译以在raspberry Pi上运行,这将是很方便的。如果两个OGL平台基本上都兼容,那么这就没有问题了 由于我是OpenGL的初学者,我当然首先开始尝试“hello

如果该程序仅执行2D加速渲染,那么是否可以在“桌面”OpenGL和OpenGL ES 2.0平台上运行相同的程序(未经修改)

一台普通的Windows桌面PC和Raspberry Pi将运行该程序。 GL上下文是通过优秀的SDL2库提供的函数获得的。对于绘图例程,将使用纹理图集

如果一个程序可以在PC上开发/调试,然后简单地重新编译以在raspberry Pi上运行,这将是很方便的。如果两个OGL平台基本上都兼容,那么这就没有问题了

由于我是OpenGL的初学者,我当然首先开始尝试“hello triangle”程序

让我大吃一惊的是,这个三角形程序可以在桌面和Raspberry Pi(GLES2)上运行。保存一些
#包括
文件差异

被所有不同的OpenGL标题和函数指针体操弄得眼花缭乱,现在我不确定我的桌面是否以某种方式提供了GLES2(这在我看来似乎不太可能),或者我的“桌面”OpenGL版本是否与GLES2“足够兼容”

我特别不清楚GLES2是OpenGL的精简版还是完全不同的版本

避免“高级”或缺少扩展/功能是否足以确保跨这些平台的兼容性?或者有更多的东西需要考虑吗?

OpenGLES(或多或少)是一个精简版的OpenGL(它主要去除旧的遗留问题,以及任何可能影响电池寿命的功能)。这里和那里有一些非常微小的差异,但基本上就是这样

在Pi上,您仅限于GLES。然而在桌面上,NVidia和ATI都支持OpenGL和OpenGLES。我可以想象,你基于SDL的应用程序针对的是一个带有GLES的EGL上下文,并且由于SDL包装了所有特定于平台的窗口API,所以应该只在桌面上工作

如果你真的想知道血淋淋的细节,请继续阅读

初始化OpenGL(和GLES)的方法是查询图形驱动程序中指向函数的指针。让我们举一个垃圾的例子:

//这通常是gl.h格式
//一些防止C++名称篡改的魔术,并使用
//C命名约定。
#ifdef_uucplusplus
#定义外部外部“C”
#否则
#定义外部
#恩迪夫
//声明与void glFinish()匹配的函数指针类型
typedef void(*GL_FINISH_PTR_TYPE)();
//现在声明一个保存地址的函数指针。
//实际指针将隐藏在OpenGL.lib中,
//或GLES2.lib(即在某个C文件中)
外部GL_饰面\u PTR_类型glFinish;
基本上,整个GL API都将重复该过程

然后在某个源文件中,我们将声明指针

#包括“gl.h”
//这是我们的函数指针,我们最初将其设置为NULL
GL_FINISH_PTR_类型glFinish=NULL;
现在,以下内容可能是特定于平台的,但在每个平台上,我们都希望从驱动程序中提取这些GL方法的地址。所以在windows上,它看起来有点像:

\ifdef\u WIN32
void initGL()
{
//从驱动程序中提取glFinish的指针
glFinish=(GL_FINISH_PTR_类型)wglGetProcAddress(“glFinish”);
}
#恩迪夫
在覆盆子皮上,它看起来像:

#ifdef覆盆子皮
void initGL()
{
//从驱动程序中提取glFinish的指针
glFinish=(GL_FINISH_PTR_类型)eglGetProcAddress(“glFinish”);
}
#恩迪夫
因此,平台之间唯一不同的是:

  • 创建窗口所需的API
  • 创建OpenGL(或GLES上下文)所需的API
  • 提取函数指针时需要调用的函数
很容易,所有特定于平台的东西都很好地包装在SDL中,所以您真的不需要关心它。只要以SDL为目标,只要您将自己限制为GLES API调用,它就可以在两种平台上工作


警告:您可能会遇到NVidia/ATI/Intel硬件之间的微小驱动程序差异(例如,支持的最大纹理大小等),并且明显不同的硬件在RAM数量等方面会有不同的规格。如果您的应用程序在较小的硬件平台上工作,它通常也会在更好的硬件上工作

为什么要依赖于什么时候可以根据适当的OpenGL ES实现(如or)进行开发呢?谢谢@genpfault,非常有趣。看起来很有希望!谢谢你的回答。我使用SDL2来避免您提到的所有细节(函数指针、扩展争用等)。我可能误解了SDL2与EGL结合的某些方面,因为对于我的简单测试程序,我仍然必须在Windows上使用函数指针(想想
GetProcAddress
)。在RPI上,EGL函数已经通过某些头函数可用。如果有办法去除这种“胶水”,那就更好了。