Java 画布上的模糊文本

Java 画布上的模糊文本,java,opengl,canvas,jogl,text-rendering,Java,Opengl,Canvas,Jogl,Text Rendering,我有一个简单的自定义画布 import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.awt.GLCanvas; import com.jogamp.opengl.glu.GLU; import com.jogamp.open

我有一个简单的自定义画布

import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.util.awt.TextRenderer;

import java.awt.*;

public class MyCanvas extends GLCanvas implements GLEventListener {

private GLU glu;

public MyCanvas() {
    this.addGLEventListener(this);
}

TextRenderer renderer;
@Override
public void init(GLAutoDrawable drawable) {
    renderer = new TextRenderer(new Font("SansSerif", Font.BOLD, 16));

    GL2 gl = drawable.getGL().getGL2();
    glu = new GLU();
    gl.glClearColor(1f, 1f, 1f, 1f);
    gl.glClearDepth(1.0f);
    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glDepthFunc(GL.GL_LEQUAL);
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
    gl.glShadeModel(GL2.GL_SMOOTH);
}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    GL2 gl = drawable.getGL().getGL2();

    if (height == 0) height = 1;
    float aspect = (float)width / height;

    gl.glViewport(0, 0, width, height);

    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(45.0, aspect, 0.1, 100.0);

    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
}

@Override
public void display(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    gl.glTranslatef(0.0f, 0.0f, -50f);
    gl.glColor3f(0.5f, 0.5f, 0.5f);
    gl.glBegin(GL2.GL_TRIANGLES);
    gl.glVertex3f(0.0f, 1.0f, 0.0f);
    gl.glVertex3f(-1.0f, -1.0f, 0.0f);
    gl.glVertex3f(1.0f, -1.0f, 0.0f);
    gl.glEnd();

    String text = "Text";
    renderer.setColor(Color.BLACK);
    renderer.begin3DRendering();
    gl.glPushMatrix();
    gl.glTranslated(0, 0, 0);
    renderer.draw(text, 0, 0);
    renderer.flush();
    gl.glPopMatrix();
    renderer.end3DRendering();
}

@Override
public void dispose(GLAutoDrawable drawable) { }
}
我有一个简单的JFrame来显示这个画布

import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class App extends JFrame {

private static final int CANVAS_WIDTH = 640;
private static final int CANVAS_HEIGHT = 480;
private static final int FPS = 60;

public App() {
    GLCanvas canvas = new MyCanvas();
    canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));

    final FPSAnimator animator = new FPSAnimator(canvas, FPS, true);

    this.getContentPane().add(canvas);
    this.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            new Thread() {
                @Override
                public void run() {
                    if (animator.isStarted()) animator.stop();
                    System.exit(0);
                }
            }.start();
        }
    });
    this.setTitle("JOGL (GLCanvas)");
    this.pack();
    this.setVisible(true);
    animator.start();
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(App::new);
}
}
当我运行程序时,我看到非常模糊的文本。


当我减小文本大小时,文本变得越来越模糊。如何获得清晰的文本?

文本模糊,因为字体大小与屏幕上的渲染大小不匹配,并且使用双线性插值来放大字体/字体纹理


出现此问题的原因可能是混合了二维和三维文本渲染功能。您应该使用
begin3DRendering
draw3D
end3DRendering
,可以通过缩放参数控制文本的实际大小,或者使用
beginRendering
draw
endRendering
使用正交投影将像素从字体映射到屏幕。

如果创建较大的字体,它会改变什么吗?@BDL Of coure,我的文本变大了。但是我不需要非常大的文本,我应该更清楚地写下我的意思:看起来字体渲染器使用的纹理大小对于文本渲染的大小来说太小了。模糊部分来自此纹理上的双线性插值。顺便说一句,您应该用“GLU.createGLU(GL)”替换“new GLU()”,您当前正在创建一个功能不是很强的通用GLU实例,在某些情况下可能抛出不支持的操作异常。谢谢,朋友!你真的节省了我的时间!