当我的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中使用前一种顺序?如果不会在每次绘画调用之前和之后都被迫转置我的数据,那将很好。
答案 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));