基于linux系统的OpenGL环境(二)

OpenGL函数文档
第9版红宝书github
GLSL文档

远程显示设备

  继续上一篇,使用EGL创建surface之后,就可以进行编译和执行了

# 编译链接
gcc -o example example.c -lEGL
# 执行
./example

如果程序马上执行结束,就是属于正常的,如果程序卡在那里不动也没有结束,就说明还有问题,可能是在寻找显示设备DISPLAY,但是寻找不到就卡在那里。EGL创建的surface会绑定到一个默认显示设备上,而linux中可以通过设置DISPLAY变量来指定显示设备,同时也可以将显示设备设置为一个远程显示器,这样可以通过远程网络进行显示。

# 在~/.bashrc文件中设置DISPLAY
export DISPLAY=IP:0.0
# 之后执行source ~/.bashrc

这样可以在windows上远程显示出来,这里可以使用putty和Xming软件进行远程显示,这样操作完成之后,程序就应该可以正常执行了。
  除了使用Xming还可以使用VNCserver来进行远程显示

yum install tigervnc-server
yum install tigervnc
# 设置密码
vncserver

然后在windows端安装vncviewer或者tightvnc,就可以远程连接登录linux系统了,vncserver桌面删除命令如下所示。

# 删除桌面
vncserver kill :1

  但是需要注意的是,这种远程显示是直接发送绘图指令的,常规的绘图指令比如打开一个桌面或者软件界面,都是没有问题的。但是如果要操纵更加复杂的底层绘图指令,比如使用opengl的freeglut库的glut函数来创建窗口或者缓存等,会调用基于X11的GLX库,但是windows的窗口系统没有GLX库,那么程序就会运行失败。

在多个显卡中指定显示设备

  如果linux系统上有多个显卡,可以指定某个显卡为显示设备

#define EGL_EGLEXT_PROTOTYPES
#include <EGL/egl.h>
#include <EGL/eglext.h>

main()
{
  static const int MAX_DEVICES = 4;
  EGLDeviceEXT eglDevs[MAX_DEVICES];
  EGLint numDevices;

  PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT =
    (PFNEGLQUERYDEVICESEXTPROC)
    eglGetProcAddress("eglQueryDevicesEXT");

  eglQueryDevicesEXT(MAX_DEVICES, eglDevs, &numDevices);

  printf(“Detected %d devices\n”, numDevices);

  PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT =
    (PFNEGLGETPLATFORMDISPLAYEXTPROC)
    eglGetProcAddress("eglGetPlatformDisplayEXT");

  eglDpy = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, 
                                    eglDevs[0], 0);

  // ...
}
创建窗口

  使用EGL创建一个窗口的简单流程是

eglGetDisplay()
eglInitialize()
eglChooseConfig()
eglCreateWindowSurface()
eglCreatePBufferSurface()
eglCreatePixmapSurface()
# draw with GL
eglSwapBuffers()

  其中第一种是可以直接显示在屏幕上的surface类型,

EGLSurface eglCreateWindowSurface()

而另外两种surface类型则不会直接显示在屏幕上,分别是

eglCreatePBufferSurface()
eglCreatePixmapSurface()

  通过查询函数文档,知道其调用方式是

EGLSurface eglCreateWindowSurface(	EGLDisplay display,
									EGLConfig config,
								 	NativeWindowType native_window,
								 	EGLint const * attrib_list);
管理你自己的OpenGL资源

  在之前的例子中,使用EGL创建Pbuffer Surface,并用EGL管理所有的Buffer,这个类似于窗口中默认的Framebuffer。也可以你自己管理OpenGL资源,这时就要跳过函数eglCreatePbufferSurface(),之后要出创建OpenGL Context,并且要通过一个函数绑定

eglMakeCurrent(eglDpy, EGL_NO_SURFACE, EGL_NO_SURFACE, eglCtx);

之后就要自己创建一个Frame Buffer Object (FBO),然后绑定纹理和渲染缓存,这点是很有用的,可以避免从EGL Surface拷贝数据到CUDA/OpenGL加速缓存。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要开发基于OpenGL ES的实时滤镜相机,您需要以下开发环境: 1. 一台计算机:您需要一台配有OpenGL ES 2.0或更高版本的计算机,以便能够编写和测试您的代码。 2. 编辑器:您需要一个能够编写OpenGL ES代码的编辑器。一些常用的编辑器包括Visual Studio Code、Sublime Text和Atom。 3. OpenGL ES SDK:您需要安装适用于您的目标平台的OpenGL ES SDK。例如,如果您的目标平台是Android设备,则需要安装Android NDK。 4. 相机API:您需要使用相机API来访问设备的摄像头。对于Android设备,您可以使用Camera2 API。 5. 滤镜库:您需要选择并集成一个滤镜库,以便能够添加各种滤镜效果。一些常用的滤镜库包括GPUImage和OpenCV。 6. 设备测试:最后,您需要在目标设备上测试您的应用程序。您可以使用Android模拟器进行测试,但最好在实际设备上进行测试,以确保您的应用程序能够正常工作并获得所需的性能。 ### 回答2: 开发基于OpenGL ES的实时滤镜相机需要具备以下开发环境: 1. 操作系统:开发可以在 Windows、Mac OS X 或 Linux 上进行,这些操作系统都支持OpenGL ES开发。 2. 集成开发环境(IDE):可以选择使用常见的IDE,如Android Studio、Visual Studio Code、Eclipse等。这些IDE都支持OpenGL ES开发,并且提供了强大的代码编辑和调试功能。 3. SDK:如果是开发Android应用,需要下载并安装Android SDK。Android SDK包含了Android平台的开发工具和资源,提供了OpenGL ES库和相关文档。 4. OpenGL ES库:OpenGL ES库是实现OpenGL ES的软件包,提供了OpenGL ES的函数接口和硬件加速功能。开发者需要下载并集成OpenGL ES库到项目中。 5. 设备和模拟器:为了测试应用程序,可以使用Android设备或者Android模拟器。如果要在真机上进行测试,需要确保设备支持OpenGL ES。 6. 学习资源:了解OpenGL ES的基本原理和开发技巧是非常重要的。可以通过阅读官方文档、教程、书籍或者参加培训来学习OpenGL ES。 7. 文件导入:将想要应用的滤镜效果的着色器代码以及资源文件导入项目中。 8. 编写代码:根据项目需求,使用OpenGL ES提供的函数接口编写相机和滤镜效果的相关代码。通过OpenGL ES的API可以设置相机预览、处理图像数据,应用滤镜效果并实现实时预览。 9. 测试和调试:在开发过程中,需要通过测试和调试来确保应用程序的正常运行。可以利用IDE提供的工具进行应用调试,检查是否出现错误和异常情况。 10. 发布和部署:完成开发后,可以将应用程序打包并发布到相应的应用商店。根据目标平台的要求,将应用程序部署到Android设备或者发布到其他平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值