첫 번째 Vulkan 프로그래밍 step3 교환 체인 제작

14386 단어 GLFWVulkanC++
디렉토리로 돌아가기
소스 코드는 다음 위치에 두십시오.각자의 버전에 따라 속성을 설정한 후 자유롭게 사용하세요.
GitHub

체인을 교환한다


VUlkan에는 기본 프레임 버퍼가 없습니다.화면에 표시하려면 일련의 버퍼를 가진 인프라를 만들어야 합니다.이러한 버퍼와 속성을 교환 체인이라고 부른다.

스왑 체인 지원 확인


함수는 장치가 교환 체인을 지원하는지 검사합니다.
    VkBool32 surfaceSupport;
    vkGetPhysicalDeviceSurfaceSupportKHR(_renderer->GetVulkanPhysicalDevice(), 0, _surface, &surfaceSupport);

장치 확장


교환 체인은 GPU가 묘사한 이미지 버퍼 메모리의 인프라이기 때문에 GPU 수준의 확장이 필요하다.
따라서 샘플 코드에서 VKKHR_SWAPCHAIN_EXTENSION_NAME 삽입 중
vkDeviceCreateInfo에 사용되는 장치 확장
    std::vector<const char*>    _device_extensions;
    _device_extensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
//vkdevicecreateinfoに挿入
    device_create_info.enabledExtensionCount = _device_extensions.size();
    device_create_info.ppEnabledExtensionNames = _device_extensions.data();

속성 가져오기


화면에 나타나는 호환성이 없기 때문에 교환 체인의 사용 여부만 확인하고 교환 체인을 사용할 수 없습니다.
체인을 교환하려면 세 가지 정보가 필요하다.
・기본적인 서핑 기능(체인의 화면 크기, 버퍼링 수량, etc...)
• 묘사 형식 (24비트 컬러, 흑백 이미지, 빨간색만 화면, etc...)
• 프리젠테이션 모드 사용 가능
    //基本的なサーフェスの機能

    vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu, _surface, &_surface_capabilities);

    //描写フォーマット
    uint32_t format_count = 0;
    vkGetPhysicalDeviceSurfaceFormatsKHR(gpu, _surface, &format_count, nullptr);
    std::vector<VkSurfaceFormatKHR>formats(format_count);
    vkGetPhysicalDeviceSurfaceFormatsKHR(gpu, _surface, &format_count, formats.data());
    std::cout << "DeviceSurfaceFormats: " << format_count << std::endl;
    for (int i = 0; i < format_count;i++) {
        std::cout << "Format: " << formats[i].format << std::endl;
    }

    //利用可能なプレゼンテーションモード
    uint32_t present_mode_count;
    vkGetPhysicalDeviceSurfacePresentModesKHR(_renderer->GetVulkanPhysicalDevice(),_surface, &present_mode_count, nullptr);
    std::vector<VkPresentModeKHR>present_mode_list(present_mode_count);
    vkGetPhysicalDeviceSurfacePresentModesKHR(_renderer->GetVulkanPhysicalDevice(), _surface, &present_mode_count, present_mode_list.data());
    std::cout << "DeviceSurfaceFormats: " << present_mode_count << std::endl;
    for (int i = 0; i < present_mode_count; i++) {
        std::cout << "support present mode: " << present_mode_list[i] << std::endl;
    }

프레젠테이션 모드


프레젠테이션 모드는 실제 화면에 묘사된 알고리즘을 지정합니다.
vulkan은 다음과 같은 네 가지가 있다.
VK_PRESENT_MODE_IMMEDIATE_KHR
전송된 이미지를 즉시 표시합니다.
VK_PRESENT_MODE_FIFO_KHR
모니터의 주사율을 유지하기 위해 단일 대기열을 사용합니다.새 요청이 대기열로 전송되었습니다. 요청은 대기열의 시작부터 시작합니다.대기열이 꽉 차면 대기 시간이 생긴다.
VK_PRESENT_MODE_MAILBOX_KHR
대기열이 가득 차면 프로그램은 차단하지 않고 바로 표시됩니다.3중 버퍼에 설치할 때 사용합니다.이것은 더블 버퍼를 사용할 때보다 더 매끄럽게 보일 수 있습니다.그런데 처리가 무거워질 수도 있어요.

스왑 체인 생성하기


실행할 때 필요한 정보가 모두 도착했기 때문에 교환 체인을 만듭니다
먼저 서핑을 지정합니다.
    VkSwapchainCreateInfoKHR swapchain_create_info = {};
    swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
    swapchain_create_info.pNext = nullptr;
    swapchain_create_info.flags = 0;
    swapchain_create_info.surface = _surface;
기본 서핑 기능 지정
imageformat B8G8R8A8...전색UNORM...8 대 특색이지만 0.0~1.0f로 바꿔주세요.
color space...색상 공간 지정
imageArrayLayers...다중 뷰/스테레오 서핑 수 비스테레오 이미지일 경우 1
    swapchain_create_info.minImageCount = _surface_capabilities.minImageCount;
    swapchain_create_info.imageFormat = VK_FORMAT_B8G8R8A8_UNORM; //_surface_format.format
    swapchain_create_info.imageColorSpace = _surface_format.colorSpace;
    swapchain_create_info.imageExtent.width = _surface_size_x;
    swapchain_create_info.imageExtent.height = _surface_size_y;
    swapchain_create_info.imageArrayLayers = 1;
드로잉 형식 옵션 지정하기
imageUsage ... 이미지 사용
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT...Image view를 제작하여 색상이 포함된 Image를 프레임 버퍼 메모리에 전달합니다.
sharingmode ...공유 Image 큐
한 대열 가족에게 나누다.
queueFamilyIndexCount... 다른 대기열 가문과 공유하면 가입할 수 있습니다.SHARING_MODE_CONCURRENT 때
preTransform...이미지를 표시할 때 이미지를 회전합니다.
compositeAlpha...알파 값.기본값은 1.0입니다.
    swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
    swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
    swapchain_create_info.queueFamilyIndexCount = 0;
    swapchain_create_info.pQueueFamilyIndices = nullptr;
    swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
    swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
데모 지정
clipped...디스플레이 이외의render를 버리시겠습니까?true
    swapchain_create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
    swapchain_create_info.clipped =VK_TRUE;
    swapchain_create_info.oldSwapchain = VK_NULL_HANDLE;

마지막으로 vkCreateSwapchainKHR 함수를 호출하여 완료
     vkCreateSwapchainKHR(gpu,&swapchain_create_info,nullptr,&_swapchain);

연락처


tweeter: tositada_nakada
mail: [email protected]

기부하다


paypal: tositada_nakada
Amazon: 원하는 목록

좋은 웹페이지 즐겨찾기