【发布时间】:2020-07-17 00:52:21
【问题描述】:
跟进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() 会解决它,对吧?)。
【问题讨论】:
标签: c++ node.js macos opengl node-native-addon