在 GLJpanel 中绘制图像的正确方法

Proper way to draw images in GLJpanel

我在我的 Java swing 应用程序中使用 GLJpanel 组件,我想在我的 GLJPanel 中绘制来自 FFmpegFrameGrabber 的帧图像,为此我的想法是使用下面提到的组件图形。

import org.bytedeco.javacv.Frame;
import com.jogamp.opengl.awt.GLJPanel;

public void showImage(GLJPanel panel, Frame frame) {
    Graphics2D graphics = (Graphics2D) panel.getGraphics();
    Java2DFrameConverter converter = new Java2DFrameConverter();
    BufferedImage bfimage = converter.convert(frame);
    graphics.drawImage(bfimage, null, 0,0);
}

这是在启用 GL 的组件中绘制图像的正确方法还是有其他方法,我怀疑我错了但我无法证明

我的 GLJPanel 创建如下

final GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(profile);

        GLJPanel panel = new GLJPanel(capabilities);

我所要做的就是创建一个GLEventListener,这个接口有4个方法displaydisplayChangedinitdispose然后负责绘图的公共参数GLAutoDrawable

在绘制图像的情况下 BufferedImage 我相信第一步是将任何图像输入转换为 BufferedImage 在我的情况下,我将此行为包含在实用程序 class 中并提供包含我转换后的图像的队列。

要绘制你必须使用 Texture 这个可以使用 TextureData 创建,它将使用缓冲图像如下

TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
Texture texture = TextureIO.newTexture(textureData);

所以最后我的显示应该像

public synchronized void display(GLAutoDrawable drawable) {

    BufferedImage baseImage = frames.poll();        
    if(baseImage == null)return;

    final GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);


     // Create a TextureData and Texture from it
    TextureData textureData = AWTTextureIO.newTextureData(gl.getGLProfile(), baseImage, false);
    Texture texture = TextureIO.newTexture(textureData);
    // Now draw one quad with the texture
    texture.enable(gl);
    texture.bind(gl);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_REPLACE);
    TextureCoords coords = texture.getImageTexCoords();
    gl.glBegin(GL2.GL_QUADS);
    gl.glTexCoord2f(coords.left(), coords.bottom());
    gl.glVertex3f(0, 0, 0);
    gl.glTexCoord2f(coords.right(), coords.bottom());
    gl.glVertex3f(1, 0, 0);
    gl.glTexCoord2f(coords.right(), coords.top());
    gl.glVertex3f(1, 1, 0);
    gl.glTexCoord2f(coords.left(), coords.top());
    gl.glVertex3f(0, 1, 0);
    gl.glEnd();
    texture.disable(gl);


    texture.destroy(gl);
    //baseImage = null;
}