数据组织
本篇的主要内容为VulkanSceneGraph中的数据组织方式,与Vulkan和OpenGL相同,主要有以下两种方式
- 每个种类的数据放在一起,即把每个点的坐标数据放在一起,颜色放在一起。这种方式是vsgExamples以及VSG源码中常见的使用方式,我就不再赘述,如果有需要的话,也可以留言给我,我有空的时候再做一个简单的示例。官方示例
- 每个顶点的数据放在一起,即把点的坐标、颜色等信息按照自定义的顺序排列,随后放到一起。这种方式与learnOpenGL中的方式是相近的。官方教程中这个部分为TODO状态,接下来的内容为该种方式的示例.
完整代码这里
具体实现
主要为三个方面,着色器、数据描述、数据组织存储。这三个方面需要能够相互统一起来。
如果自己要使用vsg自带的几种shader,那自己的数据就要组织成对应的形式。
shader
这里使用最简单的shader
std::string vertexShaderSource{R"(
#version 450
layout(location = 0) in vec3 vsg_Vertex;
layout(location = 1) in vec3 vsg_Color;
layout(location = 0) out vec4 fragColor;
void main()
{
fragColor = vec4(vsg_Color, 1.0f);
gl_Position = vec4(vsg_Vertex, 1.0f);
})"
};
std::string fragmentShaderSource{R"(
#version 450
layout(location = 0) in vec4 fragColor;
layout(location = 0) out vec4 outColor;
void main()
{
outColor = fragColor;
})"
};
数据描述
这里需要将数据描述以及数据属性的描述定义好。这里的描述要与shader一致。
vsg::VertexInputState::Bindings vertexBindingsDescriptions{
VkVertexInputBindingDescription{0, 6 * sizeof(float), VK_VERTEX_INPUT_RATE_VERTEX}, // vertex data
};
vsg::VertexInputState::Attributes vertexAttributeDescriptions{
VkVertexInputAttributeDescription{0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0}, // vertex data
VkVertexInputAttributeDescription{1, 0, VK_FORMAT_R32G32B32_SFLOAT, 3 * sizeof(float)}, // vertex data
};
图元数据组织存储
这里的数据来自learnOpenGL。
vsg中提供了多种类型的 Array,这些 Array为图元数据提供了连续分配的内存。根据官方教程中VSG作者robertosfield的描述,这样的数据组织方式,在渲染过程中提高了**90%**的性能,但是在内存的申请和释放等过程好像是要慢一些的,按照作者的说法是会后续进行优化。
auto verticesData = vsg::floatArray::create({
// positions // colors
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // bottom left
0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top
});
这里只好使用vsg::floatArray,当然,或许为了使用的便利,自己可能是可以根据vsg::Data基类拓展自己的数据类,那样可以在vertex数据时常改变的时候便于修改。
效果
在这里仔细观察,也可以看出Vulkan中NDC坐标系的不同,为右手系,x向右,y向下,z向里。
小结
内容比较简单,官方教程vsgTutorial当前(2023年12月17日)在这一块内容是个TODO状态,于是作一点简单的补充。
但愿能为各位节省宝贵的时间去多一点点时间陪伴爱自己的人和自己爱的人。