
1.2 输入MVP数据
MVP数据分别是模型(model)、视图(view)、投影(projection)矩阵。
WebGL可通过第三方库glMatrix(1)创建变换矩阵,接口是mat4. create()。glMatrix提供了丰富的接口,用来实现各种变换。例如mat4. translate、mat4. rotate、mat4. scale可以用来实现模型视图矩阵的位移、旋转、缩放变换。投影矩阵也可以通过mat4. create来创建,但更简便的方式则是通过mat4. perspective创建透视投影矩阵,mat4. ortho创建正交投影矩阵。矩阵创建好了之后,可以通过gl. uniformMatrix4fv将矩阵数据传递给着色器进行下一步的处理。
Vulkan可以使用封装了模型视图变换、透视投影、正交投影等的第三方库glm(2)。其中,glm::mat4用于创建模型视图矩阵,glm::translate、glm::rotate、glm::scale则用来实现具体的模型视图变换。创建透视投影矩阵的glm::perspective和创建正交投影矩阵的glm::ortho则将创建矩阵和变换的过程封装到了一个接口。
Vulkan的MVP数据可以通过vkCmdPushConstants在录制GPU命令的时候直接传递。Push Constants是Vulkan提出的一种快速地向GPU提交小规模数据的方法。也可以像顶点索引数据一样,将MVP数据传递给VkBuffer。不过和顶点索引数据不同的是,顶点索引数据传递给VkBuffer之后,可以直接在录制的时候通过vkCmdBindVertexBuffers来绑定。VkBuffer还可以用来存储其他数据,例如MVP数据。但是除了顶点和索引数据之外,存储其他数据的VkBuffer需要先生成一个描述符,例如VkDescriptorBufferInfo,并通过vkUpdateDescriptorSets将这个描述符追加到VkDescriptorSet里面。最后还是在录制的时候,通过vkCmdBindDescriptorSets告诉GPU本次绘图过程会用到这个缓冲区。
所以对于存储到VkBuffer的MVP数据,其使用过程分为以下三步。
(1)复制数据到VkBuffer。
(2)为VkBuffer创建一个VkDescriptorBufferInfo,通过vkUpdateDescriptorSets将其追加到VkDescriptorSet。
(3)在录制GPU命令的过程中,调用vkCmdBindDescriptorSets来告知GPU本次将使用的资源。