使用 Pyglet 批量绘制 GL_LINE_STRIP

Drawing GL_LINE_STRIP using Pyglet in a Batch

我正在尝试绘制两个 GL_LINE_STRIP 对象,但它们彼此相连。

Pyglet 文档说:

When using GL_LINE_STRIP, GL_TRIANGLE_STRIP or GL_QUAD_STRIP care must be taken to insert degenerate vertices at the beginning and end of each vertex list. For example, given the vertex list:

A, B, C, D

the correct vertex list to provide the vertex list is:

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

我能做些什么来分离这些对象? 使用不同的批次或 GL_LINES 不是一种选择。

您必须对顶点列表进行分组:

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

一组中的顶点被视为一个单一的顶点列表。参见 pyglet.graphics,因此可以将顶点列表添加到不同的组。每组都是一个单独的网格。


我认为文档是错误的。该方法适用于 GL_TRIANGLE_STRIPGL_QUAD_STRIP,因为这种基元类型绘制了一个填充的多边形。如果(部分)多边形的面积为 0,则根本不会绘制任何内容。
线原语 GL_LINE_STRIP 将始终在连续顶点之间画一条线。
请参见 OpenGL Primitive

例如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))