批量使用Pyglet绘制GL_LINE_STRIP

问题描述 投票:1回答:1

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

Pyglet文档说:

[使用GL_LINE_STRIPGL_TRIANGLE_STRIPGL_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。

python opengl pyglet
1个回答
1
投票

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

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,因此可以将顶点列表添加到不同的组。每个组都是一个单独的网格。


我认为文档是错误的。该方法适用于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))
© www.soinside.com 2019 - 2024. All rights reserved.