跟进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()
可以解决,对吧?)。