Процесс рендеринга electron завершается сбоем, когда программа использует собственный аддон C и gl gl.texImage2D в WebGL

#c #node.js #electron

#c #node.js #electron

Вопрос:

Я создаю переменную Uint8Array в собственном аддоне C .

Собственный аддон C создается node-gyp и napi.

Однако процесс рендеринга electron завершается сбоем, когда я использую переменную в качестве текстуры в WebGL.

Почему это так? Это ошибка в WebGL Electron?

Исходный код в собственном аддоне C .

 #include <napi.h>

int width=800;
int height=600;
uint8_t* foo;

Napi::TypedArrayOf<uint8_t> get(const Napi::CallbackInfoamp; info ) 
{
    buf = Napi::ArrayBuffer::New(info.Env(),foo,4*width*height);
    ret = Napi::TypedArrayOf<uint8_t>::New(info.Env(),
                                          4*width*height,
                                          buf,
                                          0);
    return ret;
}


Napi::Object init( Napi::Env env, Napi::Object exports ) 
{
    foo=new uint8_t[4*width*height]; 
    exports.Set( Napi::String::New( env, "get" ), Napi::Function::New( env, get ) );
    return exports;
}

NODE_API_MODULE( addon, init )

  

Части исходного кода на JavaScript

 
function draw() {
   var texWidth=800;
   var texHeight=600;
   gl.clearColor(0.0, 0.0, 0.0, 1.0);
   
   //get variable of Uint8Array from C   Native Addon
   pixels = myaddon.get();
   texture = gl.createTexture();
   gl.bindTexture(gl.TEXTURE_2D, texture);
   //Crash here
   gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texWidth, texHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE,pixels);
   gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
   gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
   gl.bindTexture(gl.TEXTURE_2D, null);

   gl.clear(gl.COLOR_BUFFER_BIT);
   gl.useProgram(program);
   gl.activeTexture(gl.TEXTURE0);
   gl.bindTexture(gl.TEXTURE_2D, texture);
   gl.uniform1i(uniforms['u_texture'], 0);
   gl.drawArrays(gl.TRIANGLES, 0, 6);
}
  

Ответ №1:

Сбой происходит, когда код C обнаруживает необработанное исключение.

Где вы объявили buf и ret?

Также попробуйте выделить место для foo перед его использованием.

 uint8_t* foo = new uint8_t[4*width*height];