Проблема с рисованием черных линий пиглетом вместо зеленых пикселей - PullRequest
1 голос
/ 29 февраля 2020

Так что я начинающий программист с Python Я играл с pyglet и обнаружил проблему, если вы запустите этот код:

from pyglet.gl import *

window = pyglet.window.Window(1000,500,"App",resizable=True)
window.set_minimum_size(500,250)

image =pyglet.resource.image("logo.png")

intt = None

def pixel(x1,y1):
    color = []
    size = []
    for x in range(x1):
        for y in range(y1):
            size.append(x)
            size.append(y)

            color.append(0)
            color.append(255)
            color.append(0)

    vertex_list = pyglet.graphics.vertex_list(x1 * y1,('v2i', size ),
                                                     ('c3B', color ))
    return vertex_list

@window.event
def on_draw():
    window.clear()
    #vertex_list = pixel(600,500)
    #vertex_list.draw(GL_POINTS)
    color = []
    size = []
    for x in range(100):
        for y in range(500):
            size.append(x+504)
            size.append(y)

            color.append(0)
            color.append(255)
            color.append(0)

    vertex_list = pyglet.graphics.vertex_list(100 * 500, ('v2i', size),
                                              ('c3B', color))

    vertex_list.draw(GL_POINTS)

pyglet.app.run()

Вы увидите, что показанная область имеет черные линии в нем. Я пытался это исправить, но это не работает, и потому что pyglet не очень известен, нет видео, которые описывают эту проблему. Я надеюсь, вы знаете, как это исправить, потому что вы моя последняя надежда.

1 Ответ

0 голосов
/ 29 февраля 2020

Если вы хотите нарисовать заполненную область, то нарисуйте прямоугольник angular GL_POLYGON примитив вместо нескольких GL_POINT примитивов. Это будет намного быстрее и гарантирует, что область полностью заполнена:

from pyglet.gl import *

window = pyglet.window.Window(1000,500,"App",resizable=True)
window.set_minimum_size(500,250)

def pixel(x1, y1, x2, y2):
    size = [x1, y1, x2, y1, x2, y2, x1, y2]
    color = []
    for _ in range(4):
        color += [0, 255, 0]
    vertex_list = pyglet.graphics.vertex_list(4, ('v2i', size ), ('c3B', color ))
    return vertex_list

@window.event
def on_draw():
    window.clear()
    vertex_list = pixel(500, 0, 600, 500)
    vertex_list.draw(GL_POLYGON)

pyglet.app.run()

Если вы хотите нарисовать pyglet.image, то сгенерируйте текстуру и pyglet.graphics.Batch:

from pyglet.gl import *

window = pyglet.window.Window(1000,500,"App",resizable=True)
window.set_minimum_size(500,250)

def quadTexture(x, y, w, h, texture):

    vertex = [x, y, x+w, y, x+w, y+h, x, y+h]
    tex = [0, 0, 1, 0, 1, 1, 0, 1]

    batch = pyglet.graphics.Batch()
    batch.add(4, GL_QUADS, texture, ('v2i', vertex ), ('t2f', tex ))
    return batch

@window.event
def on_draw():
    window.clear()
    batch.draw()

file = "logo.png"

image = pyglet.image.load(file)
tex = pyglet.graphics.TextureGroup(image.get_texture())
batch = quadTexture(20, 20, image.width, image.height, tex)
pyglet.app.run()

Гораздо проще использовать pyglet.sprite. например:

from pyglet.gl import *

window = pyglet.window.Window(1000,500,"App",resizable=True)
window.set_minimum_size(500,250)

@window.event
def on_draw():
    window.clear()
    sprite.draw()

file = "logo.png"
image = pyglet.image.load(file)
sprite = pyglet.sprite.Sprite(image, x=20, y=20)

pyglet.app.run()
...