Kotlin

Création d'un moteur de rendu personnalisé (MyRenderer)

Vous allez maintenant créer un moteur de rendu personnalisé qui chargera les données de l'image et les transmettra aux textures OpenGL. Il sera utilisé pour appliquer le nuanceur de fragment à couleur inversée.

Vous trouverez ci-dessous un schéma ; vous adapterez le code des shaders plus tard.

  1. Créer une classe kotlin MonRendu (peut être interne à InvertedColorsVideoRenderer)
static class MyRenderer implements GLSurfaceView.Renderer {

    private int viewportWidth;
    private int viewportHeight;

    ReentrantLock frameLock = new ReentrantLock();
    Frame currentFrame;

    public void displayFrame(Frame frame) {
        frameLock.lock();

        if (currentFrame != null) {
            currentFrame.destroy(); // Disposes previous frame
        }

        currentFrame = frame;
        frameLock.unlock();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Initialize shaders, textures, etc.
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
        viewportWidth = width;
        viewportHeight = height;
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // Upload YUV frame → textures
        // Draw using shaders
        // Implementation of YUV → RGB shader pipeline
        // using inverted color math
    }
}
  1. Examinons les displayFrame méthode. Il est important de noter que la trame que le sdk envoie à la méthode Renderer dans le onFrame est maintenant une propriété de la méthode Renderer. C'est à cette classe qu'il revient de détruire le cadre lorsqu'il n'est plus nécessaire. C'est la raison pour laquelle nous détruisons le cadre précédent lorsqu'un nouveau cadre arrive dans la classe Renderer
public void displayFrame(Frame frame) {
    frameLock.lock();

    if (currentFrame != null) {
        currentFrame.destroy(); // Disposes previous frame
    }
    
    currentFrame = frame;
    frameLock.unlock();
}