让我们假设我有以下AoSoA格式的简化结构来表示顶点或点:
struct VertexData
{
float px[4]; // position x
float py[4]; // position y
};也就是说,VertexData的每个实例都存储着4个顶点。我看到的几乎所有OpenGL示例都使用传统的AoS布局,但这对我来说不是一种选择。我不能改变实际的结构,我也想避免在呈现之前将数据转换成AoS格式。
那么,当数据以这种方式组织时,是否可以指示OpenGL读取顶点数据,如果是,我应该查看哪些GL函数?在我看来,问题在于让OpenGL意识到VertexData.px[i]与VertexData.py[i]是配对的,这两个值应该形成一个顶点/点。
澄清1:最后,将有一个VertexData数组,例如:std::vector<VertexData>。然后std::vector的大小将是total number of vertices / 4。
澄清2:AoSoA =数组的数组。
Update:关于如何以AoSoA格式绘制存储在SSBO中的顶点,请参见如何绘制存储在SSBO中的顶点?。
发布于 2020-01-06 18:18:19
OpenGL的顶点数组格式是为.数据数组。每个单独的数组/缓冲区绑定都可以具有相当大的步幅。但是,对于数组中的每个顶点,从一个顶点的数据(该属性)到下一个顶点的距离是相同的,这就是使它成为数组的原因。你的步调不是固定不变的。有时,它是4个字节,有时是16个字节。
因此,基于硬件的顶点拉拔在这里不会有帮助。
不管你做什么,都有一种选择是可行的:编程顶点拉制。也就是说,完全忽略顶点属性数组。将您的“顶点缓冲区”绑定为SSBO到您的着色器,并使用gl_VertexID来获取您想要的任何数据。在GLSL中是这样的:
struct Vertex4
{
float px[4]; // position x
float py[4]; // position y
};
layout(std430) readonly buffer VertexData
{
Vertex4 vertices[];
};
void main()
{
int dataIx = gl_VertexID / 4;
int vertexIx = gl_VertexID % 4;
vec2 my_position = vec2(vertices[dataIx].px[vertexIx], vertices[dataIx].py[vertexIx]);
}这将比任何基于几何着色器的解决方案更快,因为GS基本上扼杀了性能。
https://stackoverflow.com/questions/59616117
复制相似问题