JOGL / OpenGL TextRenderer Wierd Rainbow Градиент меняется при перерисовке - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь использовать TextRenderer из Java-библиотеки JOGL для рисования текста в окне, но он продолжает получать этот странный эффект цвета радуги, который меняется, когда каждое окно перерисовывается, единственная буква, которая имеет правильный цвет это первая буква.

Вот несколько скриншотов:

Screenshot 1

Screenshot 2

Screenshot 3

Я пытался найти это в Google, но это не совсем легко для Google ... Я просто получаю ответы о том, как добавить градиент в TextRenderer.

Вот мой код, который я сейчас использую:

import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.awt.TextRenderer;

import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;

class OpenGLRenderEngine extends RenderEngine implements GLEventListener{

    private TextRenderer textRenderer;

    OpenGLRenderEngine(Window window) {
        super(window);
    }

    @Override
    Component createComponent() {
        GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(profile);
        capabilities.setDepthBits(32);
        capabilities.setStencilBits(32);

        GLCanvas canvas = new GLCanvas(capabilities);
        canvas.addGLEventListener(this);

        return canvas;
    }

    public void init(GLAutoDrawable glAutoDrawable) {
        GL2 gl = glAutoDrawable.getGL().getGL2();

        textRenderer = new TextRenderer(new Font("SansSerif", Font.BOLD, 36), true, true);

        gl.glClearDepth(1.0f);
        gl.glEnable(GL2.GL_DEPTH_TEST);
        gl.glDepthFunc(GL2.GL_LEQUAL);
        gl.glEnable(GL2.GL_BLEND);
        gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL2.GL_ALPHA_TEST);
        gl.glAlphaFunc(GL.GL_GREATER, 0);
    }

    public void dispose(GLAutoDrawable glAutoDrawable) {
        GL2 gl = glAutoDrawable.getGL().getGL2();
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT | GL2.GL_STENCIL_BUFFER_BIT);
        gl.glLoadIdentity();
    }

    public void display(GLAutoDrawable glAutoDrawable) {
        GL2 gl = glAutoDrawable.getGL().getGL2();
        Dimension size = window.size;

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT | GL2.GL_STENCIL_BUFFER_BIT);
        gl.glColorMask(false, false, false, false);
        gl.glLoadIdentity();

        OpenGLRenderer renderer = new OpenGLRenderer(gl, size);

        Point[] backgroundPoints = new Point[]{
            new Point(0, 0),
            new Point(size.width, 0),
            new Point(size.width, size.height),
            new Point(0, size.height)
        };
        Color backgroundColor = (Color) window.frame.getBackground();
        renderer.drawPolygon(backgroundPoints, backgroundColor, new Point(0, 0), Integer.MIN_VALUE);

        Layout rootLayout = window.getRootLayout();
        if(rootLayout != null){
            rootLayout.render(renderer, new Point(0, 0), size);
        }

        ArrayList<OpenGLRendererPolygon> polygonsList = renderer.getPolygons();
        OpenGLRendererPolygon[] polygons = new OpenGLRendererPolygon[polygonsList.size()];
        polygonsList.toArray(polygons);
        Arrays.sort(polygons);
        for(OpenGLRendererPolygon polygon : polygons){
            renderer.renderPolygon(polygon);
        }

        gl.glColorMask(true, true, true, true);
        textRenderer.beginRendering(size.width, size.height);
        textRenderer.draw("Text to draw", 0, 0);
        textRenderer.endRendering();

        gl.glFlush();
    }

    public void reshape(GLAutoDrawable glAutoDrawable, int x, int y, int width, int height) {
        window.size.width = width;
        window.size.height = height;
    }

}
...