Сглаживание рисунков Pyglet OpenGL

Я искал способ сглаживания строк в 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() 

Может ли кто-нибудь увидеть, что я делаю неправильно?


person Jared Forsyth    schedule 30.04.2010    source источник
comment
Так что похоже, что проблема все время была в моей видеокарте. Однако это обнадеживает; моя программа должна хорошо работать для других людей.   -  person Jared Forsyth    schedule 01.05.2010


Ответы (2)


Разрешите Pyglet использовать дополнительный буфер сэмплов, это может помочь. Измените строку окна на это:

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

Это работает для меня.

person Xavier Ho    schedule 30.04.2010
comment
Спасибо, я просмотрел примеры pyglet и увидел, что там тоже используется мультисэмплинг... к сожалению, похоже, что моя проблема связана с моей видеокартой ›.‹ он не поддерживает мультисэмплинг и, возможно, не поддерживает сглаживание. Ну что ж. - person Jared Forsyth; 01.05.2010
comment
Использует ли это также сглаживание при уменьшении масштаба спрайтов? Потому что я пробовал этот код, и мои изображения выглядят ужасно при уменьшении масштаба (моя видеокарта поддерживает сглаживание). - person David Callanan; 04.08.2018

Немного сложно сказать наверняка. Первое, что нужно сделать, это, вероятно, изменить подсказку с GL_DONT_CARE на GL_NICEST. Вероятно, это не будет иметь большого значения для большинства видеокарт, но может немного помочь.

Кроме этого, это немного трудно сказать. Вот немного кода (на С++, извините):

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 (в лучшем случае) намного меньше.

person Jerry Coffin    schedule 30.04.2010