Vertexbuffer 中的 OpenGL 数组结构数据布局可能吗?

标签 opengl

我正在开发 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/

相关文章:

javascript - WebGL 基准 - 我应该创建什么样的测试?

c++ - 我可以在调用 glDrawArrays 后删除 OpenGL 顶点数组吗?

opengl - 片段着色器 - 画一条线?

c++ - 没有键盘输入的 SFML 动画

opengl - 如何从 ARGB NSImage 加载 OpenGL 纹理而不需要调整?

opengl - 高级摩尔纹,HLSL/GLSL 程序纹理着色器中的图案减少 - 抗锯齿

c++ - QT和QGLViewer程序中如何改变QGLViewer默认的远近裁剪距离?

opengl - 获取支持的 GLSL 版本

opengl - 使用 glReadPixels 进行屏幕捕获会导致某些窗口分辨率中的像素发生偏移

opengl - 如何在 Windows 7kl 上检查 OpenGL 版本