猿问

如何使用 Processing 在单独的线程中读取 OpenGL 像素?

我正在尝试在单独的线程中渲染来自处理草图的帧。Processing 有一个loadPixels()函数。问题在于 OpenGL 渲染器(P2DP3D在处理中。):PGraphicsOpenGL loadPixels()

这是我的示例草图:

void setup(){

  size(300,300,P2D);

  noFill();

  background(255);

  rectMode(CENTER);

  stroke(0,32);

  smooth(8);

  // instantiate and start rendering thread

  new PNGRenderer(this);

}


void draw(){

  // draw moving shapes

  translate(width * 0.5, height * 0.5);

  rotate(sin(frameCount * 0.075));

  scale(sin(frameCount * 0.01));

  translate(cos(frameCount * 0.01) * width * 0.1,sin(frameCount * 0.01) * height * 0.1);

  rect(0,0,width * .9,height * .9);

}


public class PNGRenderer implements Runnable{


  PApplet parent;

  PImage  frame;

  boolean shouldSave = false;


  int savedFrameCount;


  boolean isRunning = true;


  PNGRenderer(PApplet parent){

    this.parent = parent;

    this.parent.registerMethod("draw",this);


    frame = createImage(parent.width,parent.height,ARGB);

    frame.loadPixels();


    Thread renderThread = new Thread(this);

    renderThread.setName("Renderer-Thread");

    renderThread.start();

  }


  public void draw(){

    // all is well if I sample pixels in the same OpenGL thread

    //parent.loadPixels();

    shouldSave = true;

  } 


  synchronized void sampleAndSavePixels(){

    if(shouldSave){

      // program crashes if I try to save in a separate thread

      parent.loadPixels();

      arrayCopy(parent.pixels,frame.pixels);

      frame.updatePixels();

      frame.save(dataPath("frames/frame_"+nf(savedFrameCount++,4)+".png"));

      println("saved frame",savedFrameCount);

      shouldSave = false;

    }

  }


  public void run(){

    while(isRunning){

      sampleAndSavePixels();

    }

  }


}

据我所知(到目前为止我还不是 OpenGL 向导)读取像素需要在同一个 OpenGL 线程中完成。这是我试图避免的放缓。



波斯汪
浏览 79回答 1
1回答

慕码人2483693

OpenGL 上下文是线程本地的。上下文必须在线程中成为“当前”。不同的线程可以使用相同的上下文,但是一个上下文不能同时在多个线程中是当前的。您必须确保线程不会同时使用相同的上下文。当然,您可以为不同的线程创建不同的上下文,并将一个上下文共享给另一个。请参见OPENGL 多上下文但请注意,GPU 已经并行运行。在不同线程中使用 1 个 GPU 没有任何好处。GPU一次只能处理1个线程的指令。当然,渲染管道的每个阶段都会并行处理顶点、片段等
随时随地看视频慕课网APP

相关分类

Java
我要回答