我想我期待的太多了,但也许,这可能是可能的。
在python中我确实有一个巨大的numpy数组(有2点2D线),如下所示:
[ [x1, y1, x2, y2, r, g, b, width],
[x1, y1, x2, y2, r, g, b, width],
.......
]
我可以通过任何方式配置VBO和着色器来处理这些行吗?
我看不出怎么做,因为每个“向量”实际上有两个向量:)
我的想法是使用透明顶点着色器,然后使用几何着色器接受点(单个矢量),然后输出两个三角形(条带),以形成2D线。
顺便说一下: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;
在几何着色器中,您将使用输入向量的前2个分量,它们是[x1,y1]作为行的第一个点,而后两个分量是[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();
}
答案 1 :(得分:0)
我故意将此作为第二个答案发布,因为它几乎完全不同。这个不使用几何着色器,而是使用实例化渲染。这可能有些不同寻常,但我想不出它无法运作的原因。
第一部分是相同的。您可以创建单个4分量顶点属性,其中包含两个2D点的坐标,[x1,y1,x2,y2]。但是这一次,您还为属性启用了实例渲染:
glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, stride, 0);
glVertexAttribDivisor(loc, 1);
第二个调用指定相同的属性值用于每个实例的所有顶点,并且仅针对每个实例进行提升。
有了这个,我们现在可以将每一行绘制为一个单独的实例,每个实例有两个顶点:
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]每一行。