首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL和AoSoA (混合SoA)格式的数据加载/读取

OpenGL和AoSoA (混合SoA)格式的数据加载/读取
EN

Stack Overflow用户
提问于 2020-01-06 17:01:06
回答 1查看 665关注 0票数 2

让我们假设我有以下AoSoA格式的简化结构来表示顶点或点:

代码语言:javascript
复制
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中的顶点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-06 18:18:19

OpenGL的顶点数组格式是为.数据数组。每个单独的数组/缓冲区绑定都可以具有相当大的步幅。但是,对于数组中的每个顶点,从一个顶点的数据(该属性)到下一个顶点的距离是相同的,这就是使它成为数组的原因。你的步调不是固定不变的。有时,它是4个字节,有时是16个字节。

因此,基于硬件的顶点拉拔在这里不会有帮助。

不管你做什么,都有一种选择是可行的:编程顶点拉制。也就是说,完全忽略顶点属性数组。将您的“顶点缓冲区”绑定为SSBO到您的着色器,并使用gl_VertexID来获取您想要的任何数据。在GLSL中是这样的:

代码语言:javascript
复制
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基本上扼杀了性能。

如果您无法访问SSBO,因为您的硬件无法处理它们,则可以使用缓冲纹理

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59616117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档