可以在Vertexbuffer中使用OpenGL的数组结构数据布局吗?

时间:2018-08-09 09:45:59

标签: opengl

当我的3D顶点数据布局是基于组件的时候,我正在使用CUDA / OpenGL应用程序,并且我的CUDA内核达到了最佳性能:

x1, x2, x3, x4, .... xn, 
y1, y2, y3, y4, ..., yn, 
z1, z2, z3, z4, ..., zn

但是,据我所知,OpenGL更喜欢采用顶点方式的顶点数据:

x1, y1, z1, 
x2, y2, z2, 
x3, y3, z3, 
..., 
xn, yn, zn

有没有办法在OpenGL中使用前一种顺序?如果不会在每次绘画调用之前和之后都被迫转置我的数据,那将很好。

1 个答案:

答案 0 :(得分:2)

OpenGL没有任何预定义的布局,但是正如@NicolBolas指出的那样,它对某些格式有偏好。但是,您仍然可以将所拥有的数据直接传递给着色器。您(afaik)无法使用您的数据做的是仅使用一个vec3属性。但是您可以使用三个float属性,并将每个属性绑定到缓冲区的不同段。

例如,它可能如下所示:

//Shader
layout(location = 0) in float x;
layout(location = 1) in float y;
layout(location = 2) in float z;

void main()
{
    vec4 pos = vec4(x,y,z,1);
    ...
}


//Setup
glBindBuffer(GL_ARRAY_BUFFER, ...);

glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float) * VERTEX_COUNT));
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(float) * VERTEX_COUNT * 2));