가볍고 즐겁게 볼칸 레이싱을 해요.
시작
2020년 3월에 Vulkan은 지연 확장 기능을 발표했다.이 보도에서는 샘플 종목을 갱신하면서 지연 훈련의 확대를 가볍게 접했다.
목표
삼각형을 표시하는 샘플을 사용하여 그림자 모델을 표시합니다.
컨디션
동작 환경, 개발 환경은 다음과 같다.
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. 섀도우 변경 색상 변경
나는 즉시 면도기를 바꾸어 색깔이 변할 수 있는지 확인할 것이다.
이 장에서 얻은 지식
페이지 번호를 컴파일하는 일괄 처리 파일 만들기
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가지를 사용한다.
섀도우
화환이 비치는 곳 중 가장 가까운 곳에서 집행되는 면도기
화환이 어느 곳에도 맞지 않았을 때 실행되는 면도기
우선 배경색을 바꾸기 위해 미스 농담기
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 정보
지연 레이스의 교차 판정은 정점 버퍼가 아닌 Acceleration Structure(AS)라는 데이터를 사용합니다.AS는 다음 두 가지로 나뉜다.
실제 저장 정점 데이터 등의 구조
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()
함수는 양이 많기 때문에 대체적으로 내용을 정리했다.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
.정점 데이터 간의 정책 지정
//accelerationStructureGeometry.geometry.triangles.vertexStride = sizeof(Vertex);
accelerationStructureGeometry.geometry.triangles.vertexStride = sizeof(vkglTF::Vertex);
수정VkAccelerationStructureBuildOffsetInfoKHR
.삼각형 수 지정
//accelerationBuildOffsetInfo.primitiveCount = 1;
accelerationBuildOffsetInfo.primitiveCount = numTriangles;
BLAS의 빌드 명령을 실행하는 부분은 변경되지 않았습니다.이렇게 프로그램을 실행해보면 다음과 같은 그림이 나온다.모형이 너무 크지만 마우스 휠로 카메라를 움직이는 장치도 설치돼 있어 좋은 느낌으로 조정하면 찻주전자가 그려진 것을 확인할 수 있다.
이상은glTF모델의 광각훈련 가능성입니다.기사가 길어졌기 때문에, 그늘에 관해서는 아래 기사에 쓰고 싶습니다.여기까지 읽어주셔서 감사합니다.
참고 문헌
「Vulkan Tutorial」
「NVIDIA Vulkan Ray Tracing Tutorial」
'Vulkan Programing Vol.1'까지 벨의 실험실입니다.
"API Vulkan의 부드러운 해설을 3D로 응용할 수 있는 책"FADIS PRESS
Reference
이 문제에 관하여(가볍고 즐겁게 볼칸 레이싱을 해요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/nishiki/articles/4025a63d2e10ece22884텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)