2016-02-12 98 views
-1

我想我太期待了,但也许它可能。OpenGL VBO交错和交替

在Python中我有一个巨大的numpy的阵列(2点二维线),这样的事情:

[ [x1, y1, x2, y2, r, g, b, width], 
    [x1, y1, x2, y2, r, g, b, width], 
    ....... 
    ] 

有什么办法可以配置一个VBO和着色器来处理这些行?

我看不出如何做到这一点,因为每个“矢量”实际上有两个向量:)

我的想法是使用一个透明的顶点着色器,然后几何形状着色器接受点(单矢量),和然后输出两个三角形(条),形成二维线。

顺便说一句:width可以是一个很大的数字,这就是为什么我打算画线作为两个三角形。

因为我以前从未使用过几何着色器,所以我想知道这是否可能?

+0

为什么是负值?我相信这是一个有效的问题。 –

回答

0

几何着色器应该能够处理这个问题。由于它更简单一些,我会用绘制线来说明它。如果您更多地阅读几何着色器,我相信您可以弄清楚如何传递宽度,并生成三角形。

其基本思想是将[x1,y1,x2,y2]值作为单个vec4属性传递给顶点着色器。假设你已经存储在VBO的数据,并将它绑定为GL_ARRAY_BUFFER,您使用此电话:

glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, stride, 0); 

对于绘图,你用GL_POINTS为基本类型,稍后您将变成中的行几何着色器:

glDrawArrays(GL_POINTS, 0, lineCount); 

然后在顶点着色器,你只需通过沿位置:

in vec4 InPos; 
... 
    gl_Position = InPos; 

在几何着色器了,你会然后使用输入向量的前两个分量[x1,y1]作为该行的第一个点,将第二个2个分量[x2,y2]作为所生成行的第二个点:

layout (points) in; 
layout (line_strip, max_vertices = 2) out; 

void main() { 
    gl_Position = vec4(gl_in[0].gl_Position.xy, 0.0, 1.0); 
    EmitVertex(); 

    gl_Position = vec4(gl_in[0].gl_Position.wz, 0.0, 1.0); 
    EmitVertex(); 

    EndPrimitive(); 
} 
+0

我可以通过使用这个想法作为基础使我的着色器工作。此外,我能够在两端画圆帽。谢谢! –

0

我故意发布这个作为第二个答案,因为它几乎完全不同。这个不使用几何着色器,而是使用实例化渲染。这可能有些不合常规,但我想不出为什么它不起作用的原因。

第一部分是一样的。您可以创建包含两个2D点[x1,y1,x2,y2]的坐标的单个4分量顶点属性。但是,这个时候,你还能够实例化渲染的属性:

glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, stride, 0); 
glVertexAttribDivisor(loc, 1); 

第二个调用指定的相同属性值用于每个实例的所有顶点,仅每个实例前进。

有了这个,我们现在可以得出每行作为一个单独的实例,每个实例2个顶点:

glDrawArraysInstanced(GL_LINES, 0, 2, lineCount); 

现在,每个实例只能前进,一旦后果是,你会得到相同的属性值用于每个实例的两个顶点。这可能看起来像一个问题,但你可以使用gl_VertexID挑头两个组件的第一个顶点,而其他两个部件的第二个顶点:

in vec4 InPos; 
... 
    gl_Position = vec4(InPos[gl_VertexID * 2], InPos[gl_VertexID * 2 + 1], 0.0, 1.0); 

由于gl_VertexID将是0,这将让组件0和1,对应于第一个顶点的[x1,y1],以及组件2和3,对应于每行的第二个顶点的[x2,y2]。