我正在开发 CUDA/OpenGL 应用程序,当我的 3D 顶点数据布局是组件式的时,我的 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中使用以前的排序?如果我不必每次在绘制调用之前和之后都被迫转置数据,那就太好了...
最佳答案
OpenGL 没有任何预定义的布局,但正如 @NicolBolas 指出的,它对某些格式有偏好。但尽管如此,您拥有的数据可以直接传递到着色器。您(据我所知)不能对您的数据做的就是仅使用一个 vec3 属性。但是您可以使用三个浮点属性并将每个属性绑定(bind)到缓冲区的不同段。
例如,这可能如下所示:
//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));
关于Vertexbuffer 中的 OpenGL 数组结构数据布局可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51763785/