1. 程式人生 > >Vulkan Cookbook 第五章 3 建立組合影象取樣器

Vulkan Cookbook 第五章 3 建立組合影象取樣器

建立組合影象取樣器

譯者注:示例程式碼點選此處

從應用程式(API)的角度來看,取樣器和取樣影象始終是單獨的物件。但是在著色器中,他們可以組合成一個物件。在某些平臺上,使用著色器內的組合影象取樣器取樣可能比使用單獨的取樣器和取樣影象更優化。

怎麼做...

1.建立一個取樣器物件,並將其控制代碼儲存在名為sampler的VkSampler型別變數中(請參閱建立取樣器內容)。
2.建立取樣影象。將建立的影象控制代碼儲存在名為sampled_image的VkImage型別變數中。為取樣影象建立適當的檢視,並將其控制代碼儲存在名為sampled_image_view的VkImageView型別變數中(請參閱

建立取樣影象內容)。

這個怎麼運作...

在我們的應用程式中建立組合影象取樣器的方式與普通取樣器和取樣影象相同。它們在著色器中的使用方式不同。

提示:組合影象取樣器可以繫結到VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER型別的描述符。

以下程式碼使用建立取樣器建立取樣影象的內容來建立必要的物件:

if( !CreateSampler( logical_device, mag_filter, min_filter, mipmap_mode, u_address_mode, v_address_mode, w_address_mode, lod_bias, anisotropy_enable, max_anisotropy, compare_enable, compare_operator, min_lod, max_lod, border_color, unnormalized_coords, sampler ) ) {
  return false;
}

bool linear_filtering = (mag_filter == VK_FILTER_LINEAR) || (min_filter == VK_FILTER_LINEAR) || (mipmap_mode == VK_SAMPLER_MIPMAP_MODE_LINEAR);
    if( !CreateSampledImage( physical_device, logical_device, type, format, size, num_mipmaps, num_layers, usage, cubemap, view_type, aspect, linear_filtering, sampled_image, memory_object, sampled_image_view ) ) {
  return false;
}
return true;

不同之處在於著色器內不。 

提示:要建立表示GLSL著色器內的組合影象取樣器變數,我們需要使用適當的關鍵字(可能具有字首)與適當的紋理維度。

不要混淆取樣器和組合影象取樣器-兩者都在著色器中使用sampler關鍵字,但組合影象取樣器還具有指定的維度,如下所示:

layout (set=m, binding=n) uniform sampler2D <variable name>;

譯者注:取樣器是sampler而這裡的組合影象取樣器為sampler2D多了個2D維度。

我們儘量使用組合影象取樣器,因為使用它的應用程式在某些平臺上可能具有更好的效能。因此,如果沒有特別的理由使用單獨的取樣器和取樣影象,我們應該嘗試將它們組合為單個物件。