You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows缩放导致JOGL画布出现空白区域的解决方法咨询

解决JOGL 2.3.2在Windows高DPI缩放时GLCanvas无法填满窗体的问题

问题根源

Windows的高DPI缩放(如125%)会导致Java Swing逻辑像素与物理像素不匹配,JOGL的GLCanvas默认未适配这种缩放规则,从而出现顶部和右侧的黑色空白区域。

解决方案

1. 让GLCanvas自动填充窗体客户区

去掉手动设置GLCanvas固定尺寸的代码,利用Swing默认的BorderLayout让画布自动填满整个窗体客户区:

修改窗体创建代码:

//FrameMain class just adds listener to frame so it can be closed by pressing cross button
final FrameMain frame = new FrameMain("Form 1");
frame.setSize(720, 720);

// 启用JOGL高DPI支持,必须在创建GLProfile之前调用
GLProfile.enableHighDPISupport();

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

// The canvas
final GLCanvas glcanvas = new GLCanvas(capabilities);
AppMain b = new AppMain();
glcanvas.addGLEventListener(b);
// 去掉固定尺寸设置,显式指定CENTER位置让画布自动填充窗体
frame.add(glcanvas, BorderLayout.CENTER);
frame.setVisible(true);

2. 修正Reshape方法的投影矩阵

原reshape方法仅设置了视口,未同步更新投影矩阵,导致绘制内容的坐标范围无法匹配实际视口尺寸。修改reshape方法:

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

    // 设置视口为画布的实际物理像素尺寸
    gl.glViewport(0, 0, width, height);
    
    // 切换到投影矩阵模式,设置正交投影确保-1~1的坐标覆盖整个视口
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrtho(-1, 1, -1, 1, -1, 1);
    
    // 切回模型视图矩阵模式
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
}

3. 添加JVM启动参数启用高DPI感知

运行Java程序时添加以下JVM参数,让Java应用正确识别Windows的DPI缩放规则:

-Dsun.java2d.dpiaware=true -Djogl.enableHighDPISupport=true

原理说明

  • GLProfile.enableHighDPISupport():告知JOGL启用高DPI适配,让GLCanvas的尺寸计算基于物理像素而非逻辑像素。
  • 利用BorderLayout自动填充:避免手动固定尺寸导致的缩放不匹配问题,确保画布随窗体尺寸变化自动调整。
  • 修正投影矩阵:让绘制的坐标范围(-1到1)完全对应GLCanvas的实际视口,消除空白区域。

内容的提问来源于stack exchange,提问作者StreakerOne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:40:40