08/09/2020
文章目录
前言
我们将会使用内存顶点缓冲区来替换之前硬编码到顶点着色器中的顶点数据。我们将从最简单的方法开始创建一个CPU可见的缓冲区,并使用memcpy将顶点数据直接复制到缓冲区,之后将会使用暂存缓冲区将顶点数据赋值到高性能的显存中。
着色器使用顶点输入有两个方法,一个由CPU提供内存的顶点缓冲区,还有一个由GPU提供显存的顶点缓冲区,需要用到临时缓冲区。
修改顶点着色器
#version 450
#extension GL_ARB_separate_shader_objects:enable
layout(location = 0) out vec3 fragColor;
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec3 inColor;
void main(){
gl_Position = vec4(inPosition,0.0,1.0);
fragColor = inColor;
}
- in 关键字,顶点着色器读取顶点缓冲区的顶点输入/数据
- 描述布局,位置和类型,名字无所谓
准备顶点数据
GLM提供向量和矩阵之类的线性代数数据结构
#include <glm/glm.hpp>
struct Vertex
{
glm::vec2 pos;
glm::vec3 color;
}
const std::vector<Vertex> vertices =
{
{
{
0.0f,-0.5f},{
1.0f,0.0f,0.0f}},
{
{
0.5f,0.5f},{
0.0f,1.0f,0.0f}},
{
{
-0.5f,0.5f},{
0.0f,0.0f,1.0f}}
};
- 确定类型,与顶点着色器中的声明保持一致
顶点输入
一旦数据类型被提交到GPU的显存中,就需要告诉Vulkan传递到顶点着色器中的数据格式。
- 确定位置(location = 0)
- 确定类型(vec2)
struct Vertex
{
glm::vec2 pos;
glm::vec3 color;
static VkVertexInputBindingDescription getBindingDescription()
{
VkVertexInputBindingDescription bindingDescription