如何在MacOS的NodeJS本机插件上创建OpenGL上下文?

跟进this问题。

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

我无法使用OpenGL函数,因为CGLgetcurrentContext()总是返回NULL

当尝试创建要绘制的新上下文时,CGLChoosePixelFormat总是返回错误kCGLBadConnection invalid 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本机插件是动态链接的库有关,或者我的OpenGL createContext函数可能未在主线程上执行(但是如果这样,是这种情况,fork()可以解决,对吧?)。

nuoyi1024 回答:如何在MacOS的NodeJS本机插件上创建OpenGL上下文?

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

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

互动会话理解更容易感觉;例如当您交互式登录并启动应用程序时-这是交互式会话;当流程作为服务启动时-是非交互式的。如何通过系统实际管理它需要更深入的了解。据我所知,没有简单的方法可以“转义”非交互过程标志。

NodeJS可以用作网络服务器的一部分,因此我可以预料这可能就是问题所在-它是由另一个非交互式用户作为服务启动的,或者具有其他特殊条件,使其不互动。因此,也许有关如何使用/启动NodeJS本身的更多详细信息可能会阐明为什么代码无法正常工作。但是我可能希望在服务器部分使用OpenGL可能不是一个好主意(如果这是目标)。尽管有可能使用软件OpenGL实现(没有kCGLPFAAccelerated标志的情况下可能会起作用)。

顺便说一下,NodeJS至少有两个OpenGL / WebGL扩展-您是否尝试过他们的示例以查看它们在您的环境中是以相同还是不同的方式运行的? https://github.com/google/node-gles https://github.com/mikeseven/node-webgl

本文链接:https://www.f2er.com/2510970.html

大家都在问