从“1”开始3D编程
上QQ阅读APP看书,第一时间看更新

1.1 输入顶点数据

顶点数据通常在CPU端描述,然后通过缓冲区传递给GPU。最后在GPU流水线开始的时候,绑定相关的缓冲区,流水线就可以在不同的顶点着色器里面访问顶点数据。

1.1.1 描述顶点

WebGL和Vulkan通常以三角形为单位进行渲染,所以四边形其实都是由两个三角形组成的。WebGL的例子,仅指定了顶点的位置,颜色是在其他地方指定的,但是可以在指定顶点位置的同时指定顶点颜色。

WebGL示例在代码里面指定四边形四个顶点的颜色,如程序清单1-1所示。

程序清单1-1 WebGL的顶点数据

Vulkan的例子,准备的数据和WebGL的类似,但是同时指定了顶点的位置和颜色,如程序清单1-2所示。

程序清单1-2 Vulkan顶点和顶点颜色数据

1.1.2 传递顶点

所谓传递顶点数据,就是将CPU创建的顶点数据传递到GPU可见的缓冲区。

对于WebGL,顶点数据通过ARRAY_BUFFER上传给GPU,如程序清单1-3所示。

程序清单1-3 WebGL上传顶点数据

对于Vulkan而言,顶点数据是存储到VkBuffer中的。但是VkBuffer本身没有存储空间,需要通过VkDeviceMemory来存储数据。为VkDeviceMemory申请好存储空间之后,将程序清单1-2Vulkan顶点和顶点颜色数据用memcpy复制到VkDeviceMemory里面去。本书大部分例子VkDeviceMemory申请的内存是VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT类型,这类内存要先调用vkMapMemory,CPU才能对它进行读写。

具体VulkanDevice::CreateBuffer的实现,如程序清单1-4所示。

程序清单1-4 创建并复制数据到VkBuffer

WebGL和Vulkan数据传递接口的主要差别是,Vulkan提供了一个更底层的存储空间管理对象VkDeviceMemory,WebGL则封装了这部分细节。

1.1.3 绑定顶点缓冲区

绑定顶点缓冲区是一种GPU命令,所有GPU命令都是通过绘图命令或者提交命令提交给GPU的。对于WebGL,绘图和提交命令都是gl. Draw*(包括gl. drawArrays和gl. drawElements)。对于Vulkan,绘图命令是vkCmdDraw*(包括vkCmdDraw和vkCmdDrawIndexed),提交命令是vkQueueSubmit。注意:CPU里面调用gl. Draw*或者vkCmdDraw*等,仅仅是向GPU描述CPU的绘图意图,但并不等于GPU会立即去解释执行这些绘图命令,通常将CPU调用gl. Draw*和vkCmdDraw*的过程称为录制(record)GPU命令的过程。

WebGL的绑定如程序清单1-5所示。

程序清单1-5 WebGL绑定数据缓冲区

Vulkan的绑定必须发生在vkBeginCommandBuffer和vkEndCommandBuffer之间,如程序清单1-6所示。

程序清单1-6 Vulkan绑定顶点数据相关的缓冲区