【问题标题】:How to draw jagged pixellated line in OpenGL如何在OpenGL中绘制锯齿状的像素化线
【发布时间】:2016-11-24 11:32:44
【问题描述】:

我可以使用 OpenGL 画一条线,结果如下:

但是,与我的游戏像素化风格相比,这条线看起来很流畅且格格不入。我更喜欢看起来更像这样的结果:

谁能给我一些提示,告诉我如何让 OpenGL 绘制这样的像素化线?

这是我的 renderLine() 方法(恐怕使用立即模式):

public static void renderLine(float x1, float y1, float x2, float y2,
        float thickness, float[] colour) {

    // Store model matrix to prevent contamination
    glPushMatrix();

    // Set colour and thickness
    glColor4f(colour[0], colour[1], colour[2], colour[3]);
    glLineWidth(thickness);

    // Draw line
    glBegin(GL_LINES);
    {
        glVertex2f(x1, y1);
        glVertex2f(x2, y2);
    }
    glEnd();

    // Restore previous state
    glColor4f(1, 1, 1, 1);
    glLineWidth(1.0f);
    glPopMatrix();
}

【问题讨论】:

    标签: opengl pixels antialiasing


    【解决方案1】:

    OpenGL 中确实没有任何内置的东西可以绘制这样的线条。

    您可以绘制一个包含行中像素的紧密四边形,并使用片段着色器来评估哪些像素要留在其中,哪些要离开。

    但是,考虑到您希望所有游戏的外观都被像素化,最好的解决方案是渲染到较小的纹理,然后使用 x4(或任何因素)最近邻插值将其blit 到屏幕上。然后绘制这样的线减少到只是一个普通的GL_LINE 而没有GL_LINE_SMOOTHing。

    【讨论】:

    • 这种方法的问题是我的游戏中的实体不一定与游戏世界的渲染像素对齐。它们可以定位在像素“之间”,与将它们限制在像素网格中相比,这允许更平滑的移动。如果我以像素完美的方式将整个游戏渲染到更小的纹理上,我会失去这种额外的精度。但是,我也许可以将这种方法仅用于线条渲染 - 谢谢!
    • @Dan:你仍然可以使用着色器的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2011-02-14
    相关资源
    最近更新 更多