【发布时间】:2018-10-27 09:33:54
【问题描述】:
我目前的任务是将 OpenGL 代码库转换为 Vulkan,但现在偶然发现了此代码如何使用顶点缓冲区的问题,因为它非常动态地改变布局以将其作为大量帧来处理。
为了渲染其动画模型,它设置了一个包含整个模型所有数据的大缓冲区,并调用以下函数进行设置:
void SetupVertexBufferFormat(unsigned int frame1, unsigned int frame2)
{
glVertexAttribPointer(PositionAttr, 3, GL_FLOAT, false, sizeof(Vertex), &vNull[frame1].x);
glVertexAttribPointer(TexcoordAttr, 2, GL_FLOAT, false, sizeof(Vertex), &vNull[frame1].u);
glVertexAttribPointer(Position2Attr, 3, GL_FLOAT, false, sizeof(Vertex), &vNull[frame2].x);
glVertexAttribPointer(NormalAttr, 4, GL_INT_2_10_10_10_REV, true, sizeof(Vertex), &vNull[frame1].packedNormal);
glVertexAttribPointer(Normal2Attr, 4, GL_INT_2_10_10_10_REV, true, sizeof(Vertex), &vNull[frame2].packedNormal);
}
在 OpenGL 上这一切都很好,但在 Vulkan 上,顶点缓冲区布局是管道对象的一部分!这意味着移植设置需要每帧创建和销毁多个管道,因为 frame1 和 frame2 值可能几乎是随机组合的。
不能做的是改变缓冲区的内容,这是由前端生成的,因为它仍然需要与现有的 OpenGL 后端一起工作。
有什么办法可以绕过它,还是这里唯一的选择是一些复杂的管道管理?
【问题讨论】:
标签: c++ opengl vulkan opengl-4