在NVIDIA控制面板中启用抗锯齿会导致正交投影中的线失真 在OpenGL应用程序中,我在Visual Studio上开发Windows 7,我试图在英伟达控制面板上启用反走样(仅适用于应用程序.exe)。

在NVIDIA控制面板中启用抗锯齿会导致正交投影中的线失真 在OpenGL应用程序中,我在Visual Studio上开发Windows 7,我试图在英伟达控制面板上启用反走样(仅适用于应用程序.exe)。,opengl,drawing,antialiasing,nvidia,orthographic,Opengl,Drawing,Antialiasing,Nvidia,Orthographic,启用该选项会导致在正交投影中绘制的线/四边形出现少量失真 消除混叠在左侧关闭,在右侧打开: 如何在保持抗锯齿功能的情况下修复此问题 如果相关,以下是如何设置正交投影以及如何绘制黑色边框: void drawHeadsUpDisplay(void) { static int winWidth, winHeight; winWidth = glutGet(GLUT_WINDOW_WIDTH); winHeight = glutGet(GLUT_WINDOW_HEIGHT)

启用该选项会导致在正交投影中绘制的线/四边形出现少量失真

消除混叠在左侧关闭,在右侧打开:

如何在保持抗锯齿功能的情况下修复此问题

如果相关,以下是如何设置正交投影以及如何绘制黑色边框:

void drawHeadsUpDisplay(void) {
    static int winWidth, winHeight;

    winWidth = glutGet(GLUT_WINDOW_WIDTH);
    winHeight = glutGet(GLUT_WINDOW_HEIGHT);
    glPushAttrib(GL_ENABLE_BIT);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0.0f, winWidth, winHeight, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBegin(GL_LINE_LOOP);
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex2f(winWidth - 41, 48);
        glVertex2f(winWidth - 41, winHeight - 48);
        glVertex2f(winWidth - 18, winHeight - 48);
        glVertex2f(winWidth - 18, 48);
    glEnd();

    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);

    glPopAttrib();
}

在y方向有48和49。如果未启用抗锯齿,则由于投影而导致的整数舍入将隐藏差异,但如果启用抗锯齿,则可以看到坡度。换成

glBegin(GL_LINE_LOOP);
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex2f(winWidth - 41, 49);
    glVertex2f(winWidth - 41, winHeight - 49);
    glVertex2f(winWidth - 18, winHeight - 49);
    glVertex2f(winWidth - 18, 49);
glEnd();

(或48处)

通常使用线条不是最好的主意(你应该使用纹理三角形/矩形),但你的问题可能是因为线条落在标准定义的碎片“中心”之间。假设使用的是1:1正交投影,通过将坐标移动0.5,可能可以缓解(如果不能完全解决)问题。

没错,但这只解决了坡度问题。这些线仍然是抗锯齿的,我不想这样。嗯,我会的,视情况而定。在这张图中,我画了一条垂直线,其中x是常数,为什么线会模糊?这就是我想要避免的,但保持AA为on。@Nazgulled:很可能线条位置本身并不在精确的像素位置上。禁用AA时,它会在最近的像素上绘制,启用AA时,它会为两侧的像素提供一点颜色。如果使用更大的线宽(如果这是一个选项的话),这种效果就不那么明显了。@Drew Hall,@Nazgulled:将线条位置精确地映射到窗口像素并不难。这实际上与像素精确选择纹理子图像的问题相同。但一个评论不足以解释。“我想我会在下班后给出一个更长的答案。”德鲁·霍尔:为什么它不在一个精确的像素位置上?我使用整数并指定确切的位置,这是我不理解的@达滕沃尔夫:我很感激。因为OpenGL不处理像素。我猜您正在使用一些glViewport(0,0,宽度,高度);格洛托(0,宽度,0,高度,-1,1);设置投影。拿一张格纹纸。视口选择栅格单元,但正交投影不会击中栅格单元的中心,而是击中栅格线!如果你想对纹理进行像素级的完美映射,这是很好的,因为你在反转中遇到了同样的问题,两种效果都被抵消了。但在你的情况下,他们没有。改为格洛托(0.5/宽度,宽度-1+0.5/宽度,0.5/高度,高度-1+0.5/高度);应该这样做。但是为什么它们会掉下来呢?我传递的是整数,不是浮点数或其他类型的。。。使用纹理进行类似的操作似乎有些过分。因为OpenGL中的像素中心是(x+0.5,y+0.5),而不是(x,y)。我不认为我使用的是1:1正交投影,但我不确定。我在原来的问题上增加了一个更完整的例子。请看一看。