2010-04-30 247 views
9

我一直在四處尋找一種方法來在OpenGL抗混疊線,但沒有人似乎工作......這裏的一些示例代碼:Pyglet 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() 

任何人都可以看看我做錯了什麼?

+0

所以看起來問題一直是我的顯卡。不過,這令人放心。我的程序應該對其他人很好。 – 2010-05-01 19:18:18

回答

9

允許Pyglet使用額外的樣本緩衝區可能會有幫助。改變你的窗口線爲:

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

這對我有用。

+0

謝謝,我查看了pyglet的例子,看到他們也在那裏進行多重採樣...不幸的是,它看起來像我的問題是我的顯卡>。<它不支持多重採樣,也可能不反對。好吧。 – 2010-05-01 19:17:01

+0

謝謝,很好,很容易工作 – Hugoagogo 2011-03-01 23:46:19

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之間的差異(最多)是lot更少。