Pyglet OpenGL绘图抗锯齿

11

我一直在寻找OpenGL中抗锯齿线的方法,但似乎没有一个可行的方法...这里是一些示例代码:

import pyglet                                                                      
from pyglet.gl import *                                                            

window = pyglet.window.Window(resizable=True)                                      

@window.event                                                                      
def on_draw():                                                                     
    window.clear()                                                                 
    pyglet.gl.glColor4f(1.0,0,0,1.0)                                               
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)                             
    glEnable (GL_BLEND)                                                            
    glEnable (GL_LINE_SMOOTH);                                                     
    glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE)                                     
    glLineWidth (3)                                                                
    pyglet.graphics.draw(2, pyglet.gl.GL_LINES,                                    
        ('v2i', (10, 15, 300, 305))                                                
    )                                                                              

pyglet.app.run() 

有人能看出我做错了什么吗?


1
看起来问题一直都是我的显卡。不过这让人放心,我的程序应该对其他人没问题。 - Jared Forsyth
2个回答

13

允许Pyglet使用额外的采样缓冲可能有所帮助。将你的窗口行更改为此:

config = pyglet.gl.Config(sample_buffers=1, samples=4)
window = pyglet.window.Window(config=config, resizable=True) 

这对我有用。


谢谢,我查看了pyglet的示例,并发现他们也在那里进行多重采样...不幸的是,看起来我的问题是我的显卡 >.< 它不支持多重采样,也许也不支持抗锯齿。哦,算了。 - Jared Forsyth
当缩小精灵时,这个代码是否也使用了抗锯齿技术?因为我已经尝试过这个代码,但是我的图像在缩小时看起来很糟糕(我的显卡支持抗锯齿)。 - David Callanan

8

很难确定。首先,可能需要将提示从GL_DONT_CARE更改为GL_NICEST。对于大多数图形卡来说,这可能不会有太大的区别,但可能会有所帮助。

除此之外,很难说。以下是一些代码(用C++编写;抱歉):

void draw_line(float y_offset) { 
    glBegin(GL_LINES);
        glColor3f(1.0f, 1.0f, 1.0f);
        glVertex3f(-1.0f, 0.0f+y_offset, -1.0f);
        glVertex3f(1.0f, 0.1f+y_offset, -1.0f);
    glEnd();
}

void draw() { 
    glClearColor(0.0f, 0.0f, 0.2f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glFrustum(-1.2f, 1.2f, -0.2f, 0.2f, 0.8f, 5.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glLineWidth(3.0f);
    glDisable(GL_LINE_SMOOTH);
    draw_line(0.0f);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
    draw_line(-0.1f);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    draw_line(-0.2f);

    glFlush();
}

这是我从中获得的输出结果: alt text 当启用线条平滑时,差异非常明显。GL_DONT_CARE和GL_NICEST之间的差异(最多)要少得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接