примитив рисования пиглета GL_POINT. Проблема с буфером? - PullRequest
1 голос
/ 03 февраля 2020

Новичок в пиглете. У меня проблема при рисовании GL_POINT с использованием pyglet.graphicss.draw(). Я хочу, чтобы это GL_POINT рисовалось за другим в следующем пиксельном буфере, но, похоже, функция не сохраняет последние GL_POINT, которые будут нарисованы в следующем пиксельном буфере.

import pyglet
from pyglet.gl import *
from pyglet.window import key  # for key input, on_key_press

window = pyglet.window.Window(800, 600)  # create a window object with the resolution of 800x600
window.set_caption('window title')
glClear(GL_COLOR_BUFFER_BIT)
@window.event
def on_key_press(symbol, modifiers):  # keyboard input handler
    if symbol == key.L: # Drawing a center point
        print("DRAWING TEST A POINT (400, 300)")
        pyglet.graphics.draw(
            1, pyglet.gl.GL_POINTS,
            ('v2i', (400, 300))
        )

    elif symbol == key.K: # Drawing a bit further 100 more horizontally from center point
        print("DRAWING TEST A POINT (500, 300)")
        pyglet.graphics.draw(
            1, pyglet.gl.GL_POINTS,
            ('v2i', (500, 300))
        )

pyglet.app.run()

Нажатие L будет рисовать центральную точку.

Затем нажатие K будет рисовать еще 100 по центру от центра точка с последней центральной точкой.

Где ошибка? что-то не так с моим кодом? если нет, я думаю, будет ли функция pyglet.graphicss.draw() фактически перерисовывать одну за другой примитивную форму? Как мне написать код для рисования один за другим?

1 Ответ

1 голос
/ 03 февраля 2020

Проблема вызвана Двойной буферизацией . Вы можете решить проблему, нарисовав точку для обоих буферов. Нарисуйте точку дважды и поменяйте местами передний и задний буферы OpenGL на (flip).

pyglet.graphics.draw(
    1, pyglet.gl.GL_POINTS,
    ('v2i', (400, 300))
)
window.flip()
pyglet.graphics.draw(
    1, pyglet.gl.GL_POINTS,
    ('v2i', (400, 300))
)

Но я рекомендую добавить точки в список и нарисовать список. например:

import pyglet
from pyglet.gl import *
from pyglet.window import key  # for key input, on_key_press

points = []

window = pyglet.window.Window(800, 600)  # create a window object with the resolution of 800x600
window.set_caption('window title')
glClear(GL_COLOR_BUFFER_BIT)
@window.event
def on_key_press(symbol, modifiers):  # keyboard input handler
    global points
    if symbol == key.L: # Drawing a center point
        print("DRAWING TEST A POINT (400, 300)")
        points += [400, 300]

    elif symbol == key.K: # Drawing a bit further 100 more horizontally from center point
        print("DRAWING TEST A POINT (500, 300)")
        points += [500, 300]

    pyglet.graphics.draw(len(points) // 2, pyglet.gl.GL_POINTS, ('v2i', points))

pyglet.app.run()
...