EGL/OpenGL创建仅亮度通道无头渲染表面失败,如何解决?
EGL/OpenGL无头渲染创建单亮度通道帧缓冲问题
尝试使用EGL/OpenGL进行无头渲染,目标是创建仅包含单个亮度通道的帧缓冲。目前能成功选择EGL配置:
EGLint major, minor; eglSuccess = eglInitialize(eglDpy, &major, &minor); assert(eglSuccess == EGL_TRUE); // success ... static const EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_COLOR_BUFFER_TYPE, EGL_LUMINANCE_BUFFER, EGL_LUMINANCE_SIZE, 16, EGL_DEPTH_SIZE, 24, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE }; EGLint numConfigs; EGLConfig eglCfg; eglSuccess = eglChooseConfig(eglDpy, configAttribs, &eglCfg, 1, &numConfigs); assert(eglSuccess == EGL_TRUE); // success
但无法成功创建表面:
const EGLint pbufferAttribs[] = { EGL_WIDTH, surfaceWidth, EGL_HEIGHT, surfaceHeight, EGL_NONE, }; eglSurf = eglCreatePbufferSurface(eglDpy, eglCfg, pbufferAttribs); assert(eglSurf != EGL_NO_SURFACE); // fail
eglCreatePbufferSurface的文档甚至未提及亮度选项。
请问:
- 如何创建仅含亮度通道的帧缓冲渲染表面?
- EGL是否真的提供该选项(eglChooseConfig似乎显示支持)?
- 是否应该尝试渲染到纹理?
编辑:
查询后发现设备总共有91种配置:
eglGetConfigs(eglDpy, nullptr, 0, &numTotalConfigs);
但没有任何配置支持EGL_LUMINANCE_BUFFER:
std::vector<EGLConfig> configs(numTotalConfigs); eglGetConfigs(eglDpy, const_cast<EGLConfig*>(configs.data()), configs.size(), &numTotalConfigs); for (size_t i = 0; i < configs.size(); i++) { const auto& config = configs[i]; eglGetConfigAttrib(eglDpy, config, EGL_COLOR_BUFFER_TYPE, &val); // val == EGL_RGB_BUFFER every time! ... }
设备为NVIDIA Quadro P5000,eglQueryDeviceStringEXT返回内容如下:
EGL_NV_device_cuda EGL_EXT_device_drm EGL_EXT_device_drm_render_node EGL_EXT_device_query_name EGL_EXT_device_persistent_id
看来该硬件设备不支持此功能,或许可以尝试软件渲染?
感谢@Remc4的指引。
内容的提问来源于Stack Exchange,提问作者wcochran
相关产品推荐
相关产品推荐

