2013-11-28 73 views
0

所以,我成功绘制了一系列使用两个VBO的顶点和一个索引的线。 Python的列表是:Pyopengl - 从VBO绘制的几条线,但是索引颜色VBO不起作用

vertices = [ 
      [0,1],[0,2],[0,3], # Axes 1 
      [1,4],[1,5],[1,6], # Axes 2 
      [2,10],[2,11],[2,12] # Axes 3 
      ] 

indexes = [ 
      0,4,4,7, # Line 1 
      1,4,4,8, # Line 2 
      3,6,6,9 # Line 3 
      ] 

我然后将这些为numpy的阵列和麻生太郎维也纳组织:

vertexarray = np.array(vertices, dtype=np.float32) 
indexarray = np.array(indexes, dtype=np.int32) 

vertexvbo = glvbo.VBO(vertexarray) 
indexvbo = glvbo.VBO(indexarray, target=GL_ELEMENT_ARRAY_BUFFER) 

然后我绑定并使用绘制这些行:

glLineWidth(1) 
glColor4f(1,1,1,1) 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
glEnable(GL_BLEND) 

glEnableClientState(GL_VERTEX_ARRAY) 
vertexvbo.bind() 
indexvbo.bind() 
glVertexPointer(2, GL_FLOAT, 0, None) 

glDrawElements(GL_LINES, len(indexarray), GL_UNSIGNED_INT, None) 

glDisableClientState(GL_VERTEX_ARRAY) 
glDisable(GL_BLEND) 

由于此图显示(粗体白线只是使用标准OpenGL命令绘制的轴):

Uncolored Lines

现在问题来了,当我尝试着色这些。由于每个3线中的由2条较小的线,我创建尺寸3的颜色阵列:

colors = [] 

for i in range(0,3): 
     r = random.uniform(0.1,1) 
     g = random.uniform(0.1,1) 
     b = random.uniform(0.1,1) 
     color = [r,g,b,0.7] 
     colors.append(color) 

然后一个颜色索引阵列具有以下值:

colorindexes = [ 
       0,0,0,0, # Line 1 
       1,1,1,1, # Line 2 
       2,2,2,2 # Line 3 
       ] 

我然后这些转换为numpy的阵列和创建维也纳组织:

colorarray = np.array(colors, dtype=np.float32) 
colorindexarray = np.array(colorindexes, dtype=np.int32) 

colorvbo = glvbo.VBO(colorarray) 
colorindexvbo = glvbo.VBO(colorindexarray, target=GL_ELEMENT_ARRAY_BUFFER) 

为了然后绑定并使用此VBO我从前面的代码的glEnableClientState(GL_VERTEX_ARRAY)行之前添加以下代码:

glEnableClientState(GL_COLOR_ARRAY) 
colorvbo.bind() 
colorindexvbo.bind() 
glColorPointer(4, GL_FLOAT, 0, None) 

然而线不正确的颜色,如以下图所示,(对于线的数据是随机的,从而这些线不应该在相同的点作为在先前画面相交):

Colored Lines

+1

我对你在这里使用“颜色索引”一词感到十分困惑。在某些地方,你的代码似乎在[正确的意义上]使用它们(http://web.agelid.com/protect/utile/documentation/OpenGL/OpenGL%204%20-%20Color%20Index%20Mode.htm)(例如替代颜色模式为RGB [A]),但在其他地方,您将它们用作元素数组缓冲区(例如绘制顶点的索引)。你能详细说明你在这里想要做什么吗?颜色索引可以通过调用'glIndexPointer(...)'来设置,但我不相信你实际上正确地使用了“颜色索引”这个术语。 –

+0

我指的是颜色元组列表的索引。其中每个两段线具有不同的颜色并因此具有不同的颜色索引值。基本上,我试图找到一种方法,可以在从顶点的VBO中绘制时分别对每条线着色。在我的完整代码中记住,我绘制了数百万行... –

+0

也为什么我不能使用'glColorPointer(...)'函数[here](http://www.opengl.org/sdk/docs /man2/xhtml/glColorPointer.xml),我之前在从未索引的VBO中绘制线条时使用了这个功能? –

回答

1

刚抬起头,"indexed colour"实际上已经从你这里意味着什么完全不同的含义。起初,我以为你实际上使用的是索引颜色,而不是RGB [A]。你在这里做的是用一个元素数组缓冲区来绘制顶点(带颜色),你可以将它称为索引。这可能听起来很迂腐,尤其是因为现在几乎没有人使用索引颜色模式,但它最初确实让我感到不安。

至于实际的问题,我花了一些时间来看看你的代码,我认为你的印象是OpenGL使用单独的元素缓冲区来索引每种类型的顶点属性。

但事实并非如此,虽然您可以使用多个VBO来存储每个顶点属性,但它们的功能就好像它们是一个结构化数据的单个数组。也就是说,你不能做像选择顶点位置#0,顶点颜色#4和顶点正常#2通过使用单独的元素数组。你有一个单一的元素数组,它总是从同一个索引中抽取每个顶点属性。

不幸的是,上面讨论的行为意味着当你有共享一些但不是全部属性的顶点时,你必须创建两个离散的顶点。更重要的是,这意味着你的颜色数组应该和你的位置数组长度相同,并且你只使用一个索引数组来绘制两者。

+0

好吧,我希望这不会是这样。我意识到顶点结构可以存储颜色和法线等,但显然如您所说,在我的情况下,这种情况下,一条线由几条较小的线组成。同样感谢您对“索引颜色”的澄清。 –

+0

另外我知道这是超出了原来的问题范围,但是有没有办法可以修改我的VBO,这样我就可以在一个“调用”中绘制完整的行(即2个段)(这里使用这个术语是因为松散的显然我使用VBOs),因此我可以存储更少的颜色和索引,从而减少数据传输到GPU? –

+1

@JamesElder:我不完全确定你的意思。当GL绘制基元(即线)时,不需要传送一组新的顶点或者取出并重新计算每个顶点。特别是当您使用索引绘图命令或扇形或条形图元时。当这两件事发生时,它将重新使用顶点,这对顶点着色等事件很重要,因为它减少了变换工作量。您在这里使用索引绘图命令,因此(提供了一组好的索引)顶点被重用,并且您正在尽可能高效地使用GPU内存。 –