가볍고 즐겁게 볼칸 레이싱을 해요.

20214 단어 C++Vulkantech
이 글은 VulkanSDK 1.2.154.1에 앞서 확인됐으나 2020년 12월 발표된 버전 1.2.162.0 이후에는 이동이 불가능할 가능성이 있다.

시작


2020년 3월에 Vulkan은 지연 확장 기능을 발표했다.이 보도에서는 샘플 종목을 갱신하면서 지연 훈련의 확대를 가볍게 접했다.

목표


삼각형을 표시하는 샘플을 사용하여 그림자 모델을 표시합니다.

컨디션


동작 환경, 개발 환경은 다음과 같다.
  • Windows10 64bit
  • Vulkan SDK 1.2.148
  • NVIDIA GeForce 1070Ti
  • Vulkan Beta Driver Windows 452.28
  • Visual Studio 2019
  • Vulkan SDK 설치


    먼저 Vulkan SDK를 설치합니다.지연 훈련을 사용하여 Vulkan1을 확장합니다.2.135 이후를 선택하십시오.
    SDK 다운로드 페이지

    Vulkan Beta Driver 설치


    2020년 9월까지 볼칸 아우라 훈련 확대를 위해서는 제너 릴리즈 드라이브가 아닌 디벨로퍼 베타 드라이브가 필요하다.
    드라이버 다운로드 페이지
    틀리기 쉬운 부분은 볼칸 사선 훈련이 RTX 시리즈 이외에도 진행된다.위의 페이지에서 해당 GPU를 확인하십시오.

    이동 Vulkan 샘플


    나는 Sascha Willems씨의 우수한 샘플 창고를 빌리기로 결정했다.
    github.com/SaschaWillems/Vulkan
    git clone --recursive https://github.com/SaschaWillems/Vulkan.git
    cd Vulkan
    
    clone 후 자산 다운로드를 해야 합니다.편지에python 프로그램이 첨부되어 있습니다. 실행하기만 하면 OK입니다.
    python download_assets.py
    
    cmake를 실행하면build/vulkanExamples.sln 가능할 거예요.
    cmake . -B build
    
    VS로 vulkanExamples.sln를 열고 raytracingbasic를 시작으로 설정합니다.

    실행 후 삼각형이 표시됩니다.

    이렇게 준비됐습니다.이 기사의 목표는 가볍게 활동하는 것이기 때문에 이 해결 방안을 그대로 사용했다.또한 Vulkan의 초기화 주위는 모두 준비된 반과 조수 함수 등에 맡기고 raretry와 관련된 부분만 만진다.
    이후의 프로그램 대부분은 상기 창고 내의 코드가 일부 변경되었다.
    The MIT License (MIT)
    Copyright (c) 2016 Sascha Willems
    https://github.com/SaschaWillems/Vulkan/blob/master/LICENSE.md

    1. 섀도우 변경 색상 변경


    나는 즉시 면도기를 바꾸어 색깔이 변할 수 있는지 확인할 것이다.

    이 장에서 얻은 지식

  • SPIR-V
  • GLSL의 컴파일 방법
  • 3종 레이저 훈련용 면도기
  • 페이로드
  • 페이지 번호를 컴파일하는 일괄 처리 파일 만들기


    Vulkan은 GLSL 프로그램을 SPIR-V 형식으로 컴파일해야 합니다.SDK에 포함된 glslc.exe 를 사용하는 몇 가지 방법이 있습니다.
    우선 페이지 번호를 컴파일하는 데 사용되는 일괄 처리 파일을 만듭시다.GLSL 농담 황소 파일은 Vulkan\data\shaders\glsl\raytracingbasic에 있기 때문에 같은 디렉터리에 compile.bat를 준비한다.시간 지연 훈련에 사용되는 코드를 컴파일하기 위해서 --target-env=vulkan1.2 를 지정했습니다.
    %VULKAN_SDK%/Bin32/glslc.exe closesthit.rchit -o closesthit.rchit.spv --target-env=vulkan1.2
    %VULKAN_SDK%/Bin32/glslc.exe miss.rmiss -o miss.rmiss.spv --target-env=vulkan1.2
    %VULKAN_SDK%/Bin32/glslc.exe raygen.rgen -o raygen.rgen.spv --target-env=vulkan1.2
    pause
    

    배경 및 다각형 색상 변경하기


    레이저 훈련용 면도기는 다음과 같은 3가지를 사용한다.
  • RayGen 성형기
    섀도우
  • ClositHit 면도기
    화환이 비치는 곳 중 가장 가까운 곳에서 집행되는 면도기
  • Miss 면도기
    화환이 어느 곳에도 맞지 않았을 때 실행되는 면도기
  • 다른 건 애니히트 면도기, 인터셉션 면도기도 있는데 이번에는 처리하지 않는다.
    우선 배경색을 바꾸기 위해 미스 농담기miss.rmiss의 값hitValue을 바꿉니다.이 변수는'유효 하중'rayPayloadInEXT이라고 불리는 변수로'레이스'를 따라 정보를 전달한다.보통 빛과 소재의 정보를 저장하는 경우가 많죠.
    참고로'유효 하중'은 통신에서 운행하고자 하는 데이터를 가리키기 때문에'려'의 경로는 통신 경로와 상대적으로 대응하고'려'의 하중은 통신 데이터와 대응한다.
    void main()
    {
        // hitValue = vec3(0.0, 0.0, 0.2);
        hitValue = vec3(0.0, 0.5, 0.2);
    }
    
    역시 다각형의 색상을 바꾸기 위해 클로시트히트 면도기closesthit.rchit도 변경된다.
    void main()
    {
        const vec3 barycentricCoords = vec3(1.0f - attribs.x - attribs.y, attribs.x, attribs.y);
        // hitValue = barycentricCoords;
        hitValue = vec3(1.0);
    }
    
    방금 제작된 compile.bat에서 컴파일하여 프로그램을 실행하면 색상이 변했는지 확인할 수 있습니다.

    2. 모형을 읽고 지연 훈련


    이어glTF 형식의 모델을 불러와 지연 추적을 할 수 있도록 설치한다.

    이 장에서 얻은 지식

  • Acceleration Structure (AS)
  • Bottom-Level AS(BLAS)의 구축
  • Acceleration Structure 정보


    지연 레이스의 교차 판정은 정점 버퍼가 아닌 Acceleration Structure(AS)라는 데이터를 사용합니다.AS는 다음 두 가지로 나뉜다.
  • Bottom-Level AS (BLAS)
    실제 저장 정점 데이터 등의 구조
  • Top-Level AS (TLAS)
    BLAS에 대한 참조 및 변환 매트릭스 등의 구조를 저장합니다
  • .

    출전: NVIDIA Vulkan Ray Tracing Tutorial
    AS는 구체적 실행에 의존하지 않는 형태로 공개되지만, 기본적으로 BVH(Bounding Volume Hierrachy)를 상상하면 된다.BVH는 다각형 집합을 둘러싼 AABB(Axis-Arigined Bounding Box)의 나무 구조로, 잎 노드에 다각형 1장이 있다.이 구조를 사용하면 다각형의 수량 n과 화환의 교차 판정 횟수는 기본적으로\logn으로 제어할 수 있기 때문에 고속 처리할 수 있다.그래서'Acceleration'Structure'라고 불린다.

    glTF 모형으로 BLAS 구축


    모형을 이용한 광각 훈련을 위해서는 BLAS 구축이 필요하다.샘플 프로그램의 createBottomLevelAccelerationStructure() 함수는 양이 많기 때문에 대체적으로 내용을 정리했다.
  • 정점 배열과 색인 배열 만들기
  • 정점 버퍼와 인덱스 버퍼 만들기
  • BLAS 제어점 만들기
  • BLAS용 스토리지를 확보하고 손잡이와 결합
  • 빌드 명령 실행
  • glTF 로드


    우선 glTF 파일을 불러옵니다.다행히 샘플에glTF 스크롤 막대도 포함돼 있어 사용했다.우선,include와glTF와 관련된 페이지의 눈썹을 만들고, 모델의 구성원 변수를 추가합니다.
    #include "VulkanglTFModel.h"
    class VulkanExample
    {
        vkglTF::Model model;
    }
    
    다음 createBottomLevelAccelerationStructure()의 하드 코드 부분을 고칩니다.여기에 자산에 포함된 찻주전자의 모형을 읽어보자.
    //// Setup vertices for a single triangle
    //struct Vertex
    //{
    //    float pos[3];
    //};
    //std::vector<Vertex> vertices = {
    //    { {  1.0f,  1.0f, 0.0f } },
    //    { { -1.0f,  1.0f, 0.0f } },
    //    { {  0.0f, -1.0f, 0.0f } }
    //};
    
    //// Setup indices
    //std::vector<uint32_t> indices = { 0, 1, 2 };
    //indexCount = static_cast<uint32_t>(indices.size());
    
    vkglTF::memoryPropertyFlags = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
    const uint32_t glTFLoadingFlags = vkglTF::FileLoadingFlags::PreTransformVertices | vkglTF::FileLoadingFlags::PreMultiplyVertexColors | vkglTF::FileLoadingFlags::FlipY;
    model.loadFromFile(getAssetPath() + "models/teapot.gltf", vulkanDevice, queue, glTFLoadingFlags);
    
    const uint32_t numTriangles = static_cast<uint32_t>(model.indices.count) / 3;
    
    이때 마운트 옆에 정점 버퍼와 색인 버퍼가 확보될 때까지 모델류 내부에 손잡이가 있다.
    class vkglTF::Model
    {
        struct Vertices {
            int count;
            VkBuffer buffer; // 頂点バッファ
            VkDeviceMemory memory;
        } vertices;
    
        struct Indices {
            int count;
            VkBuffer buffer; // インデックスバッファ
            VkDeviceMemory memory;
        } indices;
    }
    
    따라서 버퍼의 코드를 만들 필요가 없습니다.버퍼의 구성원 변수도 삭제합니다.
    class VulkanExample
    {
        // vks::Buffer vertexBuffer;
        // vks::Buffer indexBuffer;
        // uint32_t indexCount;
        
        ~VulkanExample()
        {
            //vertexBuffer.destroy();
            //indexBuffer.destroy();
        }
        
        void createBottomLevelAccelerationStructure()
        {
    	// モデルのロードを行ったコード
    	// ...
    	
            //// Create buffers
    	//// For the sake of simplicity we won't stage the vertex data to the GPU memory
    	//// Vertex buffer
    	//VK_CHECK_RESULT(vulkanDevice->createBuffer(
    	//	VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
    	//	VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
    	//	&vertexBuffer,
    	//	vertices.size() * sizeof(Vertex),
    	//	vertices.data()));
    	//// Index buffer
    	//VK_CHECK_RESULT(vulkanDevice->createBuffer(
    	//	VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
    	//	VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
    	//	&indexBuffer,
    	//	indices.size() * sizeof(uint32_t),
    	//	indices.data()));
    	
    	// ...
        }
    }
    

    BLAS 구축


    이러한 모델의 마운트와 버퍼 영역의 제작이 완료되었고 다른 구축에 필요한 정보는 수정될 것입니다.여러 구조체가 있지만 디테일에 너무 신경 쓰지 마세요.
    우선 버퍼 메모리 장치 주소를 가져오는 부분을 모델 클래스 내부에서 가져오는 것으로 변경합니다.
    //vertexBufferDeviceAddress.deviceAddress = getBufferDeviceAddress(vertexBuffer.buffer);
    //indexBufferDeviceAddress.deviceAddress = getBufferDeviceAddress(indexBuffer.buffer);
    vertexBufferDeviceAddress.deviceAddress = getBufferDeviceAddress(model.vertices.buffer);
    indexBufferDeviceAddress.deviceAddress = getBufferDeviceAddress(model.indices.buffer);
    
    수정VkAccelerationStructureCreateGeometryTypeInfoKHR.
  • maxPrimitiveCount삼각형 수 지정
  • maxVertexCount 정수리 점 지정
  • //accelerationCreateGeometryInfo.maxPrimitiveCount = 1;
    accelerationCreateGeometryInfo.maxPrimitiveCount = numTriangles;
    //accelerationCreateGeometryInfo.maxVertexCount = static_cast<uint32_t>(vertices.size());
    accelerationCreateGeometryInfo.maxVertexCount = static_cast<uint32_t>(model.vertices.count);
    
    수정VkAccelerationStructureGeometryKHR.
  • geometry.triangles.vertexStride
    정점 데이터 간의 정책 지정
  • //accelerationStructureGeometry.geometry.triangles.vertexStride = sizeof(Vertex);
    accelerationStructureGeometry.geometry.triangles.vertexStride = sizeof(vkglTF::Vertex);
    
    수정VkAccelerationStructureBuildOffsetInfoKHR.
  • primitiveCount
    삼각형 수 지정
  • //accelerationBuildOffsetInfo.primitiveCount = 1;
    accelerationBuildOffsetInfo.primitiveCount = numTriangles;
    
    BLAS의 빌드 명령을 실행하는 부분은 변경되지 않았습니다.이렇게 프로그램을 실행해보면 다음과 같은 그림이 나온다.

    모형이 너무 크지만 마우스 휠로 카메라를 움직이는 장치도 설치돼 있어 좋은 느낌으로 조정하면 찻주전자가 그려진 것을 확인할 수 있다.

    이상은glTF모델의 광각훈련 가능성입니다.기사가 길어졌기 때문에, 그늘에 관해서는 아래 기사에 쓰고 싶습니다.여기까지 읽어주셔서 감사합니다.

    참고 문헌


    「Vulkan Tutorial」
    https://vulkan-tutorial.com/
    「NVIDIA Vulkan Ray Tracing Tutorial」
    https://nvpro-samples.github.io/vk_raytracing_tutorial_KHR/
    'Vulkan Programing Vol.1'까지 벨의 실험실입니다.
    https://slash-labo.booth.pm/items/1286100
    "API Vulkan의 부드러운 해설을 3D로 응용할 수 있는 책"FADIS PRESS
    https://booth.pm/ja/items/1562222

    좋은 웹페이지 즐겨찾기