一:概述
到目前为止,在我们介绍的例子中,几何体已经使用每个顶点的颜色进行了着色,这是一种相当有限的方法。在本教程的这一部分,我们将实现纹理映射,使几何体看起来更加有趣。这也将使我们能够在未来的章节中加载和绘制基本的3D模型。
将一个纹理添加到我们的应用程序将需要以下几步:
1. 创建一个图像对象,并存到设备内存中。
2. 从图像文件中读取像素,并填充到图像对象中。
3. 创建一个图像采样器。
4. 添加一个图像采样器描述符以从纹理中采样颜色。
我们之前已经处理过图像对象,但那些是由交换链扩展自动创建的。这次我们将自己创建一个。创建图像并用数据填充它类似于创建顶点缓冲区。我们将首先创建一个临时资源并用像素数据填充它,然后将其复制到我们用于渲染的最终图像对象。尽管可以为此目的创建一个临时图像,但Vulkan还允许您从VkBuffer复制像素到图像,并且在某些硬件上,这种API实际上更快。我们将首先创建这个缓冲区并用像素值填充它,然后创建一个图像以复制像素。创建图像与创建缓冲区没有太大区别。它涉及查询内存需求、分配设备内存并绑定,就像我们之前看到的那样。
然而,在处理图像时,我们还需要注意一些额外的事项。图像可能具有不同的布局,这会影响像素在内存中的组织方式。由于图形硬件的工作方式,仅仅按行存储像素可能不会带来最佳性能。例如,在对图像执行任何操作时,必须确保它们具有适合该操作的最佳布局。实际上,当我们指定渲染通道时,我们已经看到了一些这些图像布局(image layout):
VK_IMAGE_