【问题标题】:Difficulty with Text in JOGLJOGL 中的文本困难
【发布时间】:2010-09-28 22:15:29
【问题描述】:

我正在尝试在我的 OpenGL / JOGL 应用程序中显示文本。以下是部分代码:

private void display(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    GLUgl2 glu = new GLUgl2();

    float[] rgba = new float[4];
    backgroundColor.getRGBComponents(rgba);
    gl.glClearColor(rgba[0], rgba[1], rgba[2], 1);
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

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


    // Position the camera
    glu.gluLookAt(cameraPos.x, cameraPos.y, cameraPos.z, cameraPos.x + cameraForward.x, cameraPos.y + cameraForward.y,
            cameraPos.z + cameraForward.z, cameraUp.x, cameraUp.y, cameraUp.z);

    gl.glPushMatrix();
    GLUT glut = new GLUT();
    gl.glTranslatef(0, 0, 0);
    gl.glColor3f(1, 0, 0);
    glut.glutBitmapString(GLUT.BITMAP_HELVETICA_18, "We're going to the moon!");
    gl.glPopMatrix();

    // ...

文本在渲染开始后立即出现,然后从屏幕右侧消失。为什么会这样?

我想在用户面前显示文字,而不是作为世界上的模型。

【问题讨论】:

    标签: java opengl graphics jogl


    【解决方案1】:

    您需要在调用glutBitmapString 之前设置当前光栅位置。光栅位置是开始绘制字符串的像素。您可以使用glRasterPos... 系列函数对其进行设置。您的文本似乎“跑出”屏幕右侧的原因是调用glutBitmapString 隐式地将光栅位置移动到字符串的末尾(请参阅here)。

    【讨论】:

    • 好的,这似乎可行,并且文本是在世界上的某个位置绘制的。现在,无论相机方向如何,我怎样才能让它在用户屏幕上的同一点上绘制?
    • 啊,我忘了光栅位置会像顶点一样转换,如果你这样指定的话。你可能需要glWindowPos (opengl.org/sdk/docs/man/xhtml/glWindowPos.xml)
    • 伙计,你节省了我的时间!
    【解决方案2】:

    有一个非常简单的解决方案,但它会将您的应用与 awt “链接”,如果您试图远离它而支持 newt,这可能会很糟糕。

    以下示例使用多个文本渲染器绘制播放器 osd:一个用于播放/暂停字形,一个用于时间等信息,另一个用于电影名称。

        import com.jogamp.opengl.util.awt.TextRenderer;
    
        private static final Color DROP_SHADOW_COLOR = new Color(0, 0, 0, 0.5f);
    
        class CustomRenderDelegate implements TextRenderer.RenderDelegate {
            private int dropShadowDepth;
            private Color color;
    
            CustomRenderDelegate(int dropShadowDepth, Color color) {
                this.dropShadowDepth = dropShadowDepth;
                this.color = color;
            }
    
            public boolean intensityOnly() {
                return false;
            }
    
            public Rectangle2D getBounds(CharSequence str, Font font, FontRenderContext frc) {
                return getBounds(str.toString(), font, frc);
            }
    
            public Rectangle2D getBounds(String str, Font font, FontRenderContext frc) {
                return getBounds(font.createGlyphVector(frc, str), frc);
            }
    
            public Rectangle2D getBounds(GlyphVector gv, FontRenderContext frc) {
                Rectangle2D stringBounds = gv.getPixelBounds(frc, 0, 0);
                return new Rectangle2D.Double(stringBounds.getX(), stringBounds.getY(), stringBounds.getWidth()
                        + dropShadowDepth, stringBounds.getHeight() + dropShadowDepth);
            }
    
            public void drawGlyphVector(Graphics2D graphics, GlyphVector str, int x, int y) {
                graphics.setColor(DROP_SHADOW_COLOR);
                graphics.drawGlyphVector(str, x + dropShadowDepth, y + dropShadowDepth);
                graphics.setColor(color);
                graphics.drawGlyphVector(str, x, y);
            }
    
            public void draw(Graphics2D graphics, String str, int x, int y) {
                graphics.setColor(DROP_SHADOW_COLOR);
                graphics.drawString(str, x + dropShadowDepth, y + dropShadowDepth);
                graphics.setColor(color);
                graphics.drawString(str, x, y);
            }
        }
    
        public void init(GLAutoDrawable drawable) {
                ...
                pathRenderer = new TextRenderer(new Font("Helvetica", Font.ITALIC, 16), true, true, new CustomRenderDelegate(0,
                    Color.WHITE));
            pathRenderer.setSmoothing(true);
    
            playRenderer = new TextRenderer(new Font("Helvetica", Font.BOLD, 65), true, true, new CustomRenderDelegate(0,
                    Color.WHITE));
            pauseRenderer = new TextRenderer(new Font("Helvetica", Font.BOLD, 50), true, true, new CustomRenderDelegate(0,
                    Color.WHITE));
    
            osdRenderer = new TextRenderer(new Font("Helvetica", Font.PLAIN, 32), true, true, new CustomRenderDelegate(0,
                    Color.WHITE));
            osdRenderer.setSmoothing(true);
        }
    
        private final void updateOsd() {
            Time t = currentFrame != null ? currentFrame.getTime() : new Time(0, 0, 0, 0, 0);
            String direction = video.direction == DirectionType.DIRECTION_LEFT ? "<" : ">";
            String frameNumber = enterFrameNumber != null ? String.format("[%s]", enterFrameNumber)
                    : String.format("(%d)", t.fn);
            osdText = String.format(" %s%s x %d @ %.2f fps < %d/%d (%s) @ %d fps", TimeUtil.hmsms(t.getPtsMillis()), frameNumber, (int) video.getPlaybackRate(), playbackFps, video.readyFrames(), maxFrames, direction, video.getFilterFps());
        }
    
        private void renderOsd(GLAutoDrawable drawable) {
            updateOsd();
    
            if (isOsdEnabled) {
                maxModeWidth = (int) Math.max(maxModeWidth, playRenderer.getBounds("\u25B8").getWidth());
                maxOsdHeight = (int) Math.max(maxOsdHeight, playRenderer.getBounds("\u25B8").getHeight());
    
                if (isPaused) {
                    pauseRenderer.beginRendering(drawable.getWidth(), drawable.getHeight());
                    pauseRenderer.draw("\u2759", 10, drawable.getHeight() - maxOsdHeight - 2);
                    int barWidth = (int) pauseRenderer.getBounds("\u2759").getWidth();
                    pauseRenderer.draw("\u2759", 10 + barWidth - 3, drawable.getHeight() - maxOsdHeight - 2);
                    pauseRenderer.flush();
                    pauseRenderer.endRendering();
                } else {
                    playRenderer.beginRendering(drawable.getWidth(), drawable.getHeight());
                    playRenderer.draw("\u25B8", 10, drawable.getHeight() - maxOsdHeight - 5);
                    playRenderer.flush();
                    playRenderer.endRendering();
                }
    
                int y = (int) ((maxOsdHeight + 10) - osdRenderer.getBounds(osdText).getHeight() / 2);
                osdRenderer.beginRendering(drawable.getWidth(), drawable.getHeight());
                osdRenderer.draw(osdText, maxModeWidth + 18, drawable.getHeight() - y - 2);
                osdRenderer.flush();
                osdRenderer.endRendering();
    
                if (isFullScreen) {
                    pathRenderer.beginRendering(drawable.getWidth(), drawable.getHeight());
                    pathRenderer.draw(videoFile.getName(), 18, drawable.getHeight() - y - maxOsdHeight + 15);
                    pathRenderer.flush();
                    pathRenderer.endRendering();
                }
            }
        }
    
    
        public void display(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();
            gl.glClear(GL.GL_COLOR_BUFFER_BIT);
            gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            renderFrame(drawable);
            renderOsd(drawable);
            gl.glFinish();
        }
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2021-09-07
      • 2019-06-16
      • 1970-01-01
      • 2012-03-10
      • 2013-08-21
      • 1970-01-01
      • 2020-07-27
      • 2019-07-16
      相关资源
      最近更新 更多