Rust Vulkano Triangle (2)の続きです。
5 スワップチェインとイメージの作成
screen(サーフェイス)にイメージを描画するには、Swapchain
(スワップチェイン)が必要になります。
スワップチェインの作成と同時にSwapchainImage(イメージ)が作成され
ます。スワップチェインは、イメージをサーフェイスに描画する役目をします。
スワップチェインは、Struct vulkano::swapchain::Swapchainのnewメソッドで
作成する。
書式
fn new(device, surface, num_images, format, dimensions, layers, usage, sharing, transform, alpha, mode, clipped, old_swapchain) -> Result<(Swapchain, SwapchainImage), SwapchainCreationError>
引数には、
device(使用するVulkanデバイス)、
surface(使用するサーフェイス)、
num_images(イメージバッファの数)、
format(イメージフォーマット)、
dimensions(イメージのサイズ)、
layers(各イメージのレイヤーの数)、
usage(イメージの使用形式)、
sharing(sharing mode、キューファミリーの使用モードを指定)、
transform(surface transform、スクリーンに描画する前のイメージ変換)、
alpha(Composite alphaの指定)、
mode(present mode、イメージの表示モードの指定)、
clipped(ブッファの非表示部分をクリップ)、
old_swapchain(以前のスワップチェインの使用)
を指定する。
戻り値はResult型で、Okの場合はスワップチェインとスワップチェインイメージ
のタプル ( Swapchain, SwapcainImage ) を返す。
引数 num_images、format、dimensions、usage、alphaは、サーフェイスの
capabilitiesメソッドを用いて取得した値を指定する。
capabilitiesの取得と引数
let caps = window.surface().capabilities(physical) .expect("failed to get surface capabilities"); num_images : caps.min_image_count format : caps.supported_formats[0].0 (タプルの最初の値) dimensions : caps.current_extent.unwrap() usage : caps.supported_usage_flags alpha : caps.supported_composite_alpha.iter().next().unwrap()
その他の引数は、次のようにする。
・device : device.clone() ・surface : window.surface().clone() ・layers : 1 ・sharing : &queue ・transform : SurfaceTransform::Identity ・present : PresentMode::Fifo ・clipped : true ・old_swapchain : None
スワップチェインとイメージの作成は次のようになる。
// dimension let mut dimensions; // Swapchain and images let (mut swapchain, mut images) = { // Surface capabilities let caps = window.surface().capabilities(physical) .expect("failed to get surface capabilities"); // dimension dimensions = caps.current_extent.unwrap(); // composite alpha let alpha = caps.supported_composite_alpha.iter().next().unwrap(); // format let format = caps.supported_formats[0].0; // Swapchain and images Swapchain::new(device.clone(), window.surface().clone(), caps.min_image_count, format, dimensions, 1, caps.supported_usage_flags, &queue, SurfaceTransform::Identity, alpha, PresentMode::Fifo, true, None).expect("failed to create swapchain") };