如何在MacOS上的NodeJS原生插件上创建OpenGL上下文



跟进此问题。

我正在尝试创建一个使用OpenGL的NodeJS原生插件。

我不能使用OpenGL函数,因为CGLGetCurrentContext()总是返回NULL

当试图创建一个新的上下文来绘制时,CGLChoosePixelFormat总是返回错误kCGLBadConnectioninvalid CoreGraphics connection

让我烦恼的是,当我将创建OpenGL上下文的代码隔离到一个独立的CPP项目中时,它就可以工作了!当我在NodeJS插件中运行它时,它只是给出了一个错误!

我创建了这个NodeJS原生插件项目来举例说明我的错误:https://github.com/Psidium/node-opengl-context-error-example

这是在独立项目上执行时有效的代码,在NodeJS:中运行时出错

//
//  main.cpp
//  test_cli
//
//  Created by Borges, Gabriel on 4/3/20.
//  Copyright © 2020 Psidium. All rights reserved.
//
#include <iostream>
#include <OpenGL/OpenGL.h>
int main(int argc, const char * argv[]) {
std::cout << "Context before creating it: " << CGLGetCurrentContext() << "n";
CGLContextObj context;
CGLPixelFormatAttribute attributes[2] = {
kCGLPFAAccelerated,   // no software rendering
(CGLPixelFormatAttribute) 0
};
CGLPixelFormatObj pix;
CGLError errorCode;
GLint num; // stores the number of possible pixel formats
errorCode = CGLChoosePixelFormat( attributes, &pix, &num );
if (errorCode > 0) {
std::cout << ": Error returned by choosePixelFormat: " << errorCode << "n";
return 10;
}
errorCode = CGLCreateContext( pix, NULL, &context );
if (errorCode > 0) {
std::cout << ": Error returned by CGLCreateContext: " << errorCode << "n";
return 10 ;
}
CGLDestroyPixelFormat( pix );
errorCode = CGLSetCurrentContext( context );
if (errorCode > 0) {
std::cout << "Error returned by CGLSetCurrentContext: " << errorCode << "n";
return 10;
}
std::cout << "Context after being created is: " << CGLGetCurrentContext() << "n";
return 0;
}

我已经试过了:

  • 使用fork()在子流程中创建上下文(不起作用(
  • pixelformat属性更改为将创建我的上下文的内容(不起作用(

我有一种预感,这可能与Node本机插件是一个动态链接库有关,也可能与我的OpenGLcreateContext函数可能没有在主线程上执行有关(但如果是这种情况,fork()就会解决它,对吧?(。

访问图形硬件需要额外的权限-Windows和macOS(其他人不知道(将硬件加速OpenGL上下文的创建限制为交互式用户会话(我可能对此处的术语有误(。来自网络上的一篇文章:

如果用户未登录,CGLChoosePixelFormat将返回kCGLBadConnection

交互式会话理解更容易让感受;例如,当您以交互方式登录并启动应用程序时,它是交互式会话;当进程作为服务启动时,它是非交互式的。这个系统实际上是如何管理的,需要更深入的阅读。据我所知,并没有简单的方法"逃离"非交互式进程标志。

NodeJS可以作为web服务器的一部分使用,所以我可能认为这正是问题所在——它是作为服务启动的,由另一个非交互式用户启动,或者有其他特殊条件使其非交互式。因此,关于如何使用/start NodeJS本身的更多细节可能会澄清代码不起作用的原因。但我可能认为在服务器部分使用OpenGL可能不是一个好主意(如果这是一个目标(;尽管OpenGL软件实现(没有kCGLPFAAccelerated标志(可能工作。

顺便说一句,NodeJS至少有两个OpenGL/WebGL扩展-你有没有尝试过它们的示例,看看它们在你的环境中的行为是相同还是不同?https://github.com/google/node-gleshttps://github.com/mikeseven/node-webgl

最新更新