2010-04-30 37 views
9

Tôi đã nhìn xung quanh một cách để dòng anti-alias trong OpenGL, nhưng không ai trong số họ có vẻ làm việc ... đây là một số mã ví dụ:Pyglet OpenGL vẽ anti-aliasing

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() 

Can ai xem tôi đang làm gì sai?

+0

Vì vậy, có vẻ như vấn đề tất cả cùng là card đồ họa của tôi. Đó là yên tâm, mặc dù; chương trình của tôi nên làm tốt cho người khác. –

Trả lời

9

Cho phép Pyglet sử dụng bộ đệm mẫu bổ sung có thể hữu ích. Thay đổi dòng cửa sổ của bạn thành:

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

Điều này phù hợp với tôi.

+0

Cảm ơn, tôi đã xem các ví dụ về pyglet và thấy họ cũng lấy mẫu đa mẫu ... thật không may, có vẻ như vấn đề của tôi là card đồ họa của tôi>.

+0

Cảm ơn, các công trình đẹp và dễ dàng awesomely – Hugoagogo

8

Hơi khó để nói chắc chắn. Điều đầu tiên có lẽ là thay đổi gợi ý của bạn từ GL_DONT_CARE thành GL_NICEST. Nó có thể sẽ không tạo ra nhiều khác biệt với hầu hết các card đồ họa, nhưng nó có thể giúp một chút.

Ngoài ra, có một chút khó nói. Dưới đây là một chút mã (trong C++; xin lỗi):

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(); 
} 

Và đây là những gì tôi nhận được là đầu ra từ đó:

alt text

Sự khác biệt khi dòng-làm mịn được bật dường như khá rõ ràng. Sự khác biệt giữa GL_DONT_CARE và GL_NICEST tối đa là lot ít hơn.

Các vấn đề liên quan