Рисование GL_LINE_STRIP с использованием Pyglet в пакете - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь нарисовать два GL_LINE_STRIP объекта, но они соединяются друг с другом.

Документация Pyglet гласит:

При использовании GL_LINE_STRIP, GL_TRIANGLE_STRIP или GL_QUAD_STRIP необходимо позаботиться о вставке вырожденных вершин в начало и конец каждого списка вершин. Например, учитывая список вершин:

A, B, C, D

правильный список вершин для предоставления списка вершин:

A, A, B, C, D, D

Но это абсолютно не влияет, добавляю я это или нет.

Вот пример кода:

import pyglet

window = pyglet.window.Window()

main_batch = pyglet.graphics.Batch()

p1 = [ 300, 400, 300, 400, 162, 408, 303, 453, 300, 400, 300, 400]
p2 = [ 500, 400, 500, 400, 558, 315, 586, 372, 500, 400, 500, 400]

main_batch.add(len(p1) // 2, pyglet.gl.GL_LINE_STRIP, None, ("v2i", p1))
main_batch.add(len(p2) // 2, pyglet.gl.GL_LINE_STRIP, None, ("v2i", p2))

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

pyglet.app.run()

The result

Что я могу сделать, чтобы отделить эти объекты? Использование разных партий или GL_LINES не вариант.

1 Ответ

1 голос
/ 18 апреля 2020

Вы должны сгруппировать списки вершин:

import pyglet

window = pyglet.window.Window()

main_batch = pyglet.graphics.Batch()

grp1 = pyglet.graphics.Group()
grp2 = pyglet.graphics.Group()

p1 = [ 300, 400, 300, 400, 162, 408, 303, 453, 300, 400, 300, 400]
p2 = [ 500, 400, 500, 400, 558, 315, 586, 372, 500, 400, 500, 400]

main_batch.add(len(p1) // 2, pyglet.gl.GL_LINE_STRIP, grp1, ("v2i", p1))
main_batch.add(len(p2) // 2, pyglet.gl.GL_LINE_STRIP, grp2, ("v2i", p2))

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

pyglet.app.run()

Вершины в 1 группе считаются одним списком вершин. См. pyglet.graphics , поэтому списки вершин можно добавить в другую группу. Каждая группа - это отдельная я sh.


На мой взгляд, документация неверна. Подход будет работать для GL_TRIANGLE_STRIP или GL_QUAD_STRIP, потому что примитивные типы рисуют закрашенный многоугольник. Если площадь (части) многоугольника равна 0, то вообще ничего не рисуется.
Примитив линии GL_LINE_STRIP всегда будет рисовать линию между последовательными вершинами.
См. OpenGL Примитив .

Например GL_TRIANGLE_STRIP:

p1 = [ 300, 400, 300, 400, 162, 408, 303, 453, 300, 400, 300, 400]
p2 = [ 500, 400, 500, 400, 558, 315, 586, 372, 500, 400, 500, 400]

main_batch.add(len(p1) // 2, pyglet.gl.GL_TRIANGLE_STRIP, None, ("v2i", p1))
main_batch.add(len(p2) // 2, pyglet.gl.GL_TRIANGLE_STRIP, None, ("v2i", p2))
...