dl
dl_vk.h
浏览该文件的文档.
1
12#pragma once
13
14#ifndef DL_DISABLE_RENDER
15#include <optional>
16#include <vector>
17#include <unordered_map>
18
19#include "system/dl_platform.h"
20
21#if (DL_PLATFORM != DL_PLATFORM_ANDROID)
22#define GLFW_INCLUDE_VULKAN
23#include <GLFW/glfw3.h>
24#else
25#include <vulkan/vulkan.h>
26#include <vulkan/vulkan_android.h>
27#include "system/dl_android.h"
28#endif
29
30#if DL_PLATFORM == DL_PLATFORM_APPLE
31#include <vulkan/vulkan.h>
32#include <vulkan/vulkan_beta.h>
33#endif
34
35#include "io/dl_log.h"
36#include "math/dl_matrix.h"
37#include "render/dl_sprite.h"
38#include "base/dl_type_user.h"
39#include "memory/dl_buffer.h"
40#include "vk/dl_vertex.h"
41#include "render/dl_image.h"
42#include "render/dl_model.h"
43#include "base/dl_color.h"
45#include "render/dl_camera.h"
47#include "render/dl_light.h"
49#include "base/dl_object_pool.h"
50#include "io/dl_thread_task.h"
51
52namespace dl
53{
54
55//交换链支持细节
57{
58 VkSurfaceCapabilitiesKHR _capabilities;
59 std::vector<VkSurfaceFormatKHR> _formats;
60 std::vector<VkPresentModeKHR> _presentModes;
61};
62
63//
64struct Texture
65{
66 VkImage _image; // 纹理图像
67 VkDeviceMemory _memory; // 纹理图像内存
68 VkImageView _imageView; // 纹理图像视图
69 // 以下不保证填充
70 uint32_t _mipLevel; // mipmap数(和图像大小有关)
71 uint32_t _width; // 宽,仅2d管线的纹理填充
72 uint32_t _height; // 高,仅2d管线的纹理填充
73
75 _image{ VK_NULL_HANDLE },
76 _memory{ VK_NULL_HANDLE },
77 _imageView{ VK_NULL_HANDLE },
78 _mipLevel{ 0 },
79 _width{ 0 },
80 _height{ 0 }
81 {}
82
83 bool IsVaild()
84 {
85 return _image != VK_NULL_HANDLE;
86 }
87
88 void Delete(VkDevice device)
89 {
90 vkDestroyImageView(device, _imageView, nullptr);
91 vkDestroyImage(device, _image, nullptr);
92 vkFreeMemory(device, _memory, nullptr);
93
94 _image = VK_NULL_HANDLE;
95 }
96};
97
98// 最大图元数
99constexpr size_t NUM_MAX_PRIMITIVE = 1024;
100// 最大材质数(ubMaterial)
101constexpr size_t NUM_MAX_MATERIAL = 256;
102// 最大骨骼实例(ubBone)
103constexpr size_t NUM_MAX_BONE = 128;
104// 单个实例最大骨骼数(ubBone[96])与shader一致
105constexpr size_t NUM_MAX_JOINT = 256;
106// 平行光数量 与shader一致
107constexpr size_t NUM_MAX_LIGHT_DIR = 3;
108// 点光源数量 与shader一致
109constexpr size_t NUM_MAX_LIGHT_DOT = 10;
110// 聚光灯数量 与shader一致
111constexpr size_t NUM_MAX_LIGHT_SPOT = 3;
112// 灯光数量
114// csm级数
115constexpr size_t NUM_SHADOW_CASCADE = 4;
116// csm贴图大小
117constexpr uint32_t SIZE_SHADOW_IMAGE = 2048;
118// csm贴图格式
119constexpr VkFormat FORMAT_SHADOW_IMAGE = VK_FORMAT_D32_SFLOAT;
120
121
122
123// 最大drawcall数(2d)
124constexpr size_t NUM_MAX_DRAW_CALL_2D = 100;
125// 最大精灵数
126constexpr size_t NUM_MAX_2D_SPRITE = 402400;
127// 单个drawcall索引数(2d)
128constexpr size_t NUM_2D_INDEX = 6 * NUM_MAX_2D_SPRITE;
129// 初始Canvas顶点数
130constexpr size_t NUM_START_2D_VERTEX = 4 * 1024;
131// 最大根坐标系数(2d的cbo数)
132constexpr size_t NUM_MAX_ROOT_COOR = 32;
133// 2d纹理空闲时间后自动释放(毫秒)
134constexpr unsigned TIME_FREE_TEXTURE_2D = 60 * 1000;
135// 2d采样器数量
136constexpr size_t NUM_2D_SAMPLER = 3;
137
138// 样本着色(更高级的多重采样,基本不会使用)
139constexpr bool OPEN_SAMPLE_SHADING = false;
140// 线框模式(很多设备不支持)
141constexpr bool OPEN_FILL_MODE_NON_SOLID = false;
142
143// 验证层
144#ifdef NDEBUG
145constexpr bool ENABLE_VALIDATION_LAYERS = false;
146#else
147// linux开启验证层有问题
148#if (DL_PLATFORM == DL_PLATFORM_WIN32)
149constexpr bool ENABLE_VALIDATION_LAYERS = true;// obs注入时有问题
150#else
151constexpr bool ENABLE_VALIDATION_LAYERS = false;
152#endif
153
154#endif
155
156// 最大演员实例数量
157constexpr size_t NUM_MAX_ACTOR = 10240;
158
159// gfx顶点数(默认,会自动扩容)
160constexpr size_t NUM_GFX_VERTEX = 1024;
161
162// gfx定义(请勿修改)
163constexpr size_t INDEX_GFX_3D_NORMAL_DOT = 0;
164constexpr size_t INDEX_GFX_3D_NORMAL_LINE = 1;
165constexpr size_t INDEX_GFX_3D_NORMAL_TRIANGLE = 2;
166constexpr size_t INDEX_GFX_2D_NORMAL_DOT = 3;
167constexpr size_t INDEX_GFX_2D_NORMAL_LINE = 4;
168constexpr size_t INDEX_GFX_2D_NORMAL_TRIANGLE = 5;
169constexpr size_t INDEX_GFX_3D_TRANS_DOT = 6;
170constexpr size_t INDEX_GFX_3D_TRANS_LINE = 7;
171constexpr size_t INDEX_GFX_3D_TRANS_TRIANGLE = 8;
172constexpr size_t INDEX_GFX_2D_TRANS_DOT = 9;
173constexpr size_t INDEX_GFX_2D_TRANS_LINE = 10;
174constexpr size_t INDEX_GFX_2D_TRANS_TRIANGLE = 11;
175constexpr size_t NUM_GFX = 12;
176constexpr size_t NUM_GFX_HALF = 6;
177constexpr size_t NUM_GFX_QUAD = 3;
178
179// 持久映射2d ubo(效率似乎差不多)
180constexpr bool USE_MAPPED_2D_UBO = false;
181
182// 交换链表面格式
183constexpr VkFormat DL_VK_FORMAT_SURFACE = VK_FORMAT_B8G8R8A8_SRGB;
184constexpr VkFormat DL_VK_FORMAT_SRGB = VK_FORMAT_B8G8R8A8_SRGB;
185constexpr VkFormat DL_VK_FORMAT_UNORM = VK_FORMAT_B8G8R8A8_UNORM;
186constexpr VkFormat DL_VK_FORMAT_SRGB_TEXTURE = VK_FORMAT_R8G8B8A8_SRGB;
187constexpr VkFormat DL_VK_FORMAT_UNORM_TEXTURE = VK_FORMAT_R8G8B8A8_UNORM;
188
190class VK
191{
192public:
193 struct alignas(16) UbObject
194 {
198 float _pad;
199 };
200 // push const 至少支持128
206 static_assert(sizeof(PushConstantData) <= 128);
207 // 阴影
208 struct alignas(16) UbCSM
209 {
210 std::array<Matrix4, NUM_SHADOW_CASCADE> _viewProj;
211 };
213 {
216 };
217 static_assert(sizeof(PushConstantCSM) <= 128);
218 // 骨骼
219 struct alignas(16) UboBone
220 {
222 };
223
224 // 图元,单次draw call,多个实例共享的
225 //(变换和骨骼动画是实例化的,不放这里)
227 {
232 size_t _idTexAo;
234 };
235
236 struct Canvas
237 {
238 Texture _texture; // 【带锁】当前使用纹理
239 Texture _textureFast; // 【带锁】创建full后,旧的fast纹理存这里
240 unsigned _tkcUsed; // 使用时间戳
241 unsigned _textureState; // 0.不需要动态加载 1.使用的小图 2.加载中 3.待更新描述符 4.使用的大图
242 std::mutex _mutex;
243
244 std::string _pathTextureFull; // 为空表示本身就是使用的full纹理
245 std::vector<VkBuffer> _vertexBuffer; // 顶点缓冲(每帧改变)
246 std::vector<VkDeviceMemory> _vertexBufferMemory;// 顶点缓冲内存
247 std::vector<VkDeviceSize> _vertexBufferSize; // 顶点缓冲大小
248
249 std::vector<Sprite*> _allSprite;
250 std::vector<Sprite*> _allSpriteTrans;
251
252 size_t _id;
253 std::vector<size_t> _numVertex;
254
255 Canvas(VK* vk) :
256 _tkcUsed{ 0 },
257 _textureState{ 0 }
258 {
259 _vertexBuffer.resize(vk->_countFrame);
260 _vertexBufferMemory.resize(vk->_countFrame);
261 _vertexBufferSize.resize(vk->_countFrame);
262 _numVertex.resize(vk->_countFrame);
263 }
264
265 void TryRelase(VK* vk, unsigned tkc)
266 {
267 if (_textureState != 4)
268 return;
269
270 bool clear = _tkcUsed && tkc > _tkcUsed + TIME_FREE_TEXTURE_2D;
271 if (!clear)
272 return;
273
274 // 尝试锁住纹理
275 if (!_mutex.try_lock())
276 return;
277 vkDeviceWaitIdle(vk->GetDevice());
278 // 释放大图
279 _texture.Delete(vk->GetDevice());
280 // 切换至小图
283 // 更新描述符
284 vk->UpdateCanvasDescriptor(this);
285 _mutex.unlock();
286 _textureState = 1;
287 log_msg("Canvas纹理释放:{}", _pathTextureFull);
288 }
289
290 void TryLoad(VK* vk)
291 {
292 if (_textureState == 1)
293 {
294 _textureState = 2;
296 task._idCanvas = _id;
297 vk->_textureMgr._mtt.AddTask(task);
298 }
299 else if (_textureState == 3)
300 {
301 vkDeviceWaitIdle(vk->GetDevice());
302 vk->UpdateCanvasDescriptor(this);
303 _textureState = 4;
304 log_msg("Canvas纹理加载:{}", _pathTextureFull);
305 }
306 }
307
308 // 【多线程调用】
309 void RealLoad(VK* vk)
310 {
311 assert(_textureState == 2);
312 Texture tex;
313 vk->_create_texture_ktx(_pathTextureFull, tex);
314 _mutex.lock();
316 _texture = tex;
317 _mutex.unlock();
318 _textureState = 3;
319 }
320
321
322 void Delete(VkDevice device)
323 {
324 _mutex.lock();
325 _texture.Delete(device);
326 if (_textureFast.IsVaild())
327 _textureFast.Delete(device);
328 _mutex.unlock();
329
330 for (size_t i = 0; i < _vertexBuffer.size(); ++i)
331 {
332 vkDestroyBuffer(device, _vertexBuffer[i], nullptr);
333 vkFreeMemory(device, _vertexBufferMemory[i], nullptr);
334 }
335 }
336 };
337
339 // 2dDrawCall 按 以下优先级排序拆分(每一项都不同产生拆分,所以跨Canvas必然产生拆分)
340 // 1.半透明最后(放入单独的list处理)
341 // 2.Canvas(顶点 + 纹理)
342 // 3.矩阵
343 // 4.视口
344 // 5.裁剪
345 // 6.采样器
346 // 7.混合
347 struct DrawCall
348 {
355
356 // 现修改为顶点位置
357 size_t _beg;
358 size_t _end;
359
360 bool operator==(const DrawCall& b) const
361 {
362 return _canvas == b._canvas
363 && _rootCoor == b._rootCoor
364 && _viewport == b._viewport
366 && _sampler == b._sampler
367 && _blend == b._blend;
368 }
369 };
370 // dc和它拥有的sprite
372 {
374 std::vector<Sprite*> _listSpr;
376 {
377 return _dc == b._dc;
378 }
379 };
380 // 按z排序
382 {
383 float _z;
385 bool operator==(const DrawCallZ& b)
386 {
387 return _z == b._z
388 && _dcl == b._dcl;
389 }
390 };
391
392 struct VK2D
393 {
394 struct UBO
395 {
396 alignas(16) Matrix4 _viewProj;
397 };
398
399 struct CBO
400 {
401 alignas(16) Matrix4 _model;
403 };
404
405
406 VkPipelineLayout _pipelineLayout; // 管线布局
407 VkPipeline _graphicsPipeline; // 图形管线(无半透明)
408 VkPipeline _graphicsPipelineTrans; // 图形管线(alpha混合)
409 VkPipeline _graphicsPipelineEffect; // 图形管线(特效混合)
410 VkPipeline _graphicsPipelineGray; // 图形管线(灰度绘制)
411 VkDescriptorSetLayout _descriptorSetLayout0; // 描述符集合布局(全局)
412 VkDescriptorSetLayout _descriptorSetLayout1; // 描述符集合布局
413 std::vector<VkBuffer> _uniformBuffers; // 统一缓冲
414 std::vector<VkDeviceMemory> _uniformBuffersMemory; // 统一缓冲内存
415 std::vector<void*> _uniformBuffersMapped; // 统一缓冲映射
416 VkDescriptorPool _descriptorPool; // 描述符池
417 std::vector<VkDescriptorSet> _descriptorSets0; // 所有描述符集
418 std::vector<VkDescriptorSet> _descriptorSets1; // 所有描述符集
419 VkBuffer _indexBuffer; // 索引缓冲(注意是32位)
420 VkDeviceMemory _indexBufferMemory; // 索引缓冲内存
421 VkSampler _textureSampler; // 2d纹理采样器
422 VkSampler _textureSamplerPixel; // 2d纹理采样器
423 VkSampler _textureSamplerUI; // 2d纹理采样器
424 std::array<CBO, NUM_MAX_ROOT_COOR> _allCBO; // 常量缓冲
425 size_t _curPushConstant; // 当前使用 常量缓冲 下标
426 std::array<Coor*, NUM_MAX_ROOT_COOR> _allRootCoor; // 所有根坐标系
427 std::array<Matrix4, NUM_MAX_ROOT_COOR> _allRootCoorMat; // 所有根坐标系矩阵
428 Matrix4 _mat2D; // 2d世界坐标系
429 std::unordered_map<size_t, Canvas*> _allCanvas; // 画布(RenderTarget + 静态 + Register精灵)
430 RenderInfo2D _renderInfo; // 绘制信息
431 //------------------------缓存区域(避免每帧重分配内存)-----------------------
432 std::vector<VK::DrawCall> _vecDc;
433 std::vector<VK::DrawCall> _vecDcTrans;
437 };
438
440 {
441 struct Frame
442 {
443 VkBuffer _vertexBuffer; // 顶点缓冲(每帧改变)
444 VkDeviceMemory _vertexBufferMemory; // 顶点缓冲内存
445 VkDeviceSize _vertexBufferSize; // 顶点缓冲大小
446
448 std::size_t _index;
449 std::size_t _num;
450
452 _vertex{ nullptr },
453 _index{ 0 },
454 _num{ 0 }
455 {}
456
457 void Lock(VkDevice device)
458 {
459 vkMapMemory(device, _vertexBufferMemory, 0, _vertexBufferSize, 0, (void**)&_vertex);
460 }
461 void Unlock(VkDevice device)
462 {
463 _vertex = nullptr;
464 vkUnmapMemory(device, _vertexBufferMemory);
465 }
466 void Delete(VkDevice device)
467 {
468 vkDestroyBuffer(device, _vertexBuffer, nullptr);
469 vkFreeMemory(device, _vertexBufferMemory, nullptr);
470 }
471 };
472
473 std::vector<Frame> _frame;
474
475 void Init(VK* vk)
476 {
477 _frame.resize(vk->_countFrame);
478 }
479
480 Frame& operator[](size_t i)
481 {
482 return _frame[i];
483 }
484
485 void Delete(VkDevice device)
486 {
487 for (size_t i = 0; i < _frame.size(); ++i)
488 {
489 _frame[i].Delete(device);
490 }
491 }
492 };
493
494
495 struct VKGfx
496 {
497 struct UBO
498 {
500 };
501 VkPipelineLayout _pipelineLayout; //管线布局
502 // 3d和2d共用管线,但透明度需要区分
503 // 点、线、三角形(半透明x2)
504 std::array<VkPipeline, NUM_GFX_HALF> _vecGraphicsPipeline;// 图形管线
505 // uniform为 帧数 * 2 (3d,2d 各一个)
506 VkDescriptorSetLayout _descriptorSetLayout; //描述符集合布局
507 std::vector<VkBuffer> _uniformBuffers; //统一缓冲
508 std::vector<VkDeviceMemory> _uniformBuffersMemory; //统一缓冲内存
509 VkDescriptorPool _descriptorPool; //描述符池
510 std::vector<VkDescriptorSet> _descriptorSets; //所有描述符集
511
512 // 点、线、三角形、2d点、2d线、2d三角形(半透明x2)
513 std::array<VertexBufferGfx, NUM_GFX> _arrVB;
514 // CPU写入缓冲区
515 std::array<std::vector<VertexGfx>, NUM_GFX> _allVertex;
516 };
517
518 // 渲染目标(3d默认具有0下标)
520 {
523 Texture _texColorOut; // 由Canvas释放
524 VkFramebuffer _frameBuffer;
525
526 void Delete(VkDevice device)
527 {
528 vkDestroyFramebuffer(device, _frameBuffer, nullptr);
529 _texColor.Delete(device);
530 _texDepth.Delete(device);
531 }
532 };
533
534 VK(GLFWwindow* window) :
535 _currentFrame{ 0 },
536 _bFrameBufferResize{ false },
537 _textureMgr{ this }
538 {
539 _allValidationLayer =
540 {
541 "VK_LAYER_KHRONOS_validation"
542 };
543 _allDeviceExtension =
544 {
545 VK_KHR_SWAPCHAIN_EXTENSION_NAME
546 };
547#if DL_PLATFORM == DL_PLATFORM_APPLE
548 _allDeviceExtension.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
549#endif
550
551 _init(window);
552 }
553
557 VkShaderModule CreateShaderModule(Buffer& buf);
558
562 void Update();
563
567 void Render(GLFWwindow* window);
568
573 {
574 _curPushConstant = 1;
575 }
576
580 void SetFrameBufferResize() { _bFrameBufferResize = true; }
581
583 static VKAPI_ATTR VkBool32 VKAPI_CALL CallbackDebug(
584 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
585 VkDebugUtilsMessageTypeFlagsEXT messageType,
586 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
587 void* pUserData)
588 {
589 if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
590 log_test0(pCallbackData->pMessage);
591 else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
592 log_info0(pCallbackData->pMessage);
593
594 return VK_FALSE;
595 }
596
597 static VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
598 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
599 const VkAllocationCallbacks* pAllocator,
600 VkDebugUtilsMessengerEXT* pDebugMessenger)
601 {
602 auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
603 if (func != nullptr)
604 return func(instance, pCreateInfo, pAllocator, pDebugMessenger);
605 else
606 return VK_ERROR_EXTENSION_NOT_PRESENT;
607 }
608
609 static void DestroyDebugUtilsMessengerEXT(VkInstance instance,
610 VkDebugUtilsMessengerEXT debugMessenger,
611 const VkAllocationCallbacks* pAllocator)
612 {
613 auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
614 if (func != nullptr)
615 func(instance, debugMessenger, pAllocator);
616 }
617
618 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
622 uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
626 bool CreateBuffer(VkDeviceSize size,
627 VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
628 VkBuffer& buffer, VkDeviceMemory& bufferMemory);
632 void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
636 void CopyBufferToImage(VkBuffer buffer, VkImage image,
637 uint32_t width, uint32_t height, uint32_t mip_level);
642 const std::array<VkBuffer, NUM_MIPMAP_2D>& vec_buffer,
643 VkImage image, const std::array<Size, NUM_MIPMAP_2D>& vec_size);
644
648 template <typename T>
649 void CreateVertexBufferGPU(const std::vector<T>& vertices,
650 VkBuffer& vertexBuffer,
651 VkDeviceMemory& vertexBufferMemory)
652 {
653 VkDeviceSize bufferSize = sizeof(T) * vertices.size();
654
655 VkBuffer stagingBuffer;
656 VkDeviceMemory stagingBufferMemory;
657 CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
658 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
659 stagingBuffer, stagingBufferMemory);
660
661 void* data;
662 vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data);
663 memcpy(data, vertices.data(), (size_t)bufferSize);
664 vkUnmapMemory(_device, stagingBufferMemory);
665
666 CreateBuffer(bufferSize,
667 VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
668 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
669 vertexBuffer, vertexBufferMemory);
670
671 CopyBuffer(stagingBuffer, vertexBuffer, bufferSize);
672
673 vkDestroyBuffer(_device, stagingBuffer, nullptr);
674 vkFreeMemory(_device, stagingBufferMemory, nullptr);
675 }
676
679 template <typename T>
680 bool CreateVertexBufferCPU(size_t vertex_num,
681 VkBuffer& vertexBuffer, VkDeviceMemory& vertexBufferMemory, VkDeviceSize& bufferSize)
682 {
683 bufferSize = sizeof(T) * vertex_num;
684 return CreateBuffer(bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
685 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
686 vertexBuffer, vertexBufferMemory);
687
688 //映射内存
689 /*void* data;
690 vkMapMemory(_device, vertexBufferMemory, 0, bufferSize, 0, &data);
691 memcpy(data, vertices.data(), (size_t)bufferSize);
692 vkUnmapMemory(_device, vertexBufferMemory);*/
693 }
694
700 template<typename T>
701 void CreateIndexBuffer(const std::vector<T>& indices, VkBuffer& indexBuffer, VkDeviceMemory& indexBufferMemory)
702 {
703 VkDeviceSize bufferSize = sizeof(T) * indices.size();
704
705 VkBuffer stagingBuffer;
706 VkDeviceMemory stagingBufferMemory;
707 CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
708 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
709 stagingBuffer, stagingBufferMemory);
710
711 void* data;
712 vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data);
713 memcpy(data, indices.data(), (size_t)bufferSize);
714 vkUnmapMemory(_device, stagingBufferMemory);
715
716 CreateBuffer(bufferSize,
717 VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
718 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
719 indexBuffer, indexBufferMemory);
720
721 CopyBuffer(stagingBuffer, indexBuffer, bufferSize);
722
723 vkDestroyBuffer(_device, stagingBuffer, nullptr);
724 vkFreeMemory(_device, stagingBufferMemory, nullptr);
725 }
726
729 void CreateImage(uint32_t w, uint32_t h, uint32_t mip_level, VkSampleCountFlagBits numSamples,
730 VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,
731 VkImage& image, VkDeviceMemory& imageMemory, uint32_t layers = 1);
732
736 VkImageView CreateImageView(VkImage image, VkFormat format,
737 VkImageAspectFlags aspectFlags, uint32_t mip_level);
738
742 VkCommandBuffer BeginSingleTimeCommands();
746 void EndSingleTimeCommands(VkCommandBuffer commandBuffer);
750 void TransitionImageLayout(VkImage image, VkFormat format,
751 VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mip_level);
755 VkFormat FindSupportedFormat(const std::vector<VkFormat>& candidates,
756 VkImageTiling tiling, VkFormatFeatureFlags features);
757
759 VkFormat FindDepthFormat();
761 bool HasStencilComponent(VkFormat format)
762 {
763 return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
764 }
765
766 VkDevice GetDevice() { return _device; }
767
770 {
771 for (size_t i = 0; i < _allMaterial.size(); ++i)
772 {
773 if (_allMaterial[i] == m)
774 return i;
775 }
776 size_t id = _allMaterial.size();
777 if (id >= NUM_MAX_MATERIAL)
778 {
779 log_warn("材质数超过上限!");
780 return 0;
781 }
782 void* data;
783 vkMapMemory(_device, _ubMaterialMemory[id], 0, sizeof(m), 0, &data);
784 memcpy(data, &m, sizeof(m));
785 vkUnmapMemory(_device, _ubMaterialMemory[id]);
786
787 _allMaterial.push_back(m);
788 return id;
789 }
790
793
794
798 void RenderModel(VkCommandBuffer command_buffer, Model* model, size_t shadow);
800 void DeleteModel(Model* model)
801 {
802 if (!model)
803 return;
804 vkDestroyBuffer(_device, model->_indexBuffer, nullptr);
805 vkFreeMemory(_device, model->_indexBufferMemory, nullptr);
806
807 vkDestroyBuffer(_device, model->_vertexBuffer, nullptr);
808 vkFreeMemory(_device, model->_vertexBufferMemory, nullptr);
809
810 delete model;
811 }
812
814 {
815 return _curPushConstant++;
816 }
817
819 {
820 if (id >= _allPushConstant.size())
821 {
822 log(fmt::format("超过 推送常量区上限:{}", _allPushConstant.size()));
823 return nullptr;
824 }
825 return &_allPushConstant[id];
826 }
827
829 void UpdateUboBone(size_t id, std::vector<Matrix4>& trans)
830 {
831 if (trans.empty())
832 return;
833 size_t size = sizeof(Matrix4) * (std::min)(trans.size(), NUM_MAX_JOINT);
834 size_t index = id * _countFrame + _currentFrame;
835
836 void* data;
837 vkMapMemory(_device, _ubBoneMemory[index], 0, size, 0, &data);
838 memcpy(data, trans.data(), size);
839 vkUnmapMemory(_device, _ubBoneMemory[index]);
840 }
841
844 {
845 for (size_t i = 0; i < _mapBoneUse.size(); ++i)
846 {
847 if (!_mapBoneUse[i])
848 return i;
849 }
850 log("无可用骨骼ub!");
851 return -1;
852 }
853
854 void SetUboBoneFree(size_t id)
855 {
856 assert(_mapBoneUse[id]);
857 _mapBoneUse[id] = false;
858 }
859
860 void SetUboBoneUse(size_t id)
861 {
862 assert(!_mapBoneUse[id]);
863 _mapBoneUse[id] = true;
864 }
865
867 {
868 _pass._debugView = (float)type;
869 }
871 {
872 return (DebugView3D)_pass._debugView;
873 }
874
876 size_t CreateTextureReal(Image* image, bool srgb, bool delete_image);
877
883 size_t CreateTexture(std::string_view path_name, bool srgb = true);
884
885
887 // 初始使用fast_tex,后续动态加载完整tex
888 void CreateCanvas(size_t id, Texture tex, std::string_view path_tex_full);
889 void CreateCanvasImage(size_t tex_id, const std::array<Image*, NUM_MIPMAP_2D>& vec_image);
890 void CreateCanvasImageKtx(size_t tex_id, std::string_view path_name, std::string_view path_tex_full);
892
894
895 // 需要canvas【加锁】 只能主线程调用
897
898 Canvas* GetCanvas(size_t id);
899 Canvas* GetCanvasByTexture(size_t tex_id);
901
903 {
904 return _2d._allCanvas.size();
905 }
906
908 Texture CreateTexture2D(const std::array<Image*, NUM_MIPMAP_2D>& vec_image);
909
911 // 仅更新2d的动态纹理
912 // 必须通过暂存缓冲更新
913 void UpdateTexture2D(Texture tex, const PointU& xy, Image* image, const RectU& rect);
914
915 //!导出交换链图像
916 void ScreenShot(std::string_view path_name);
917
918 //!导出图像
919 void ExportTexture(Texture tex, std::string_view path_name);
920
921 void ExportTextureCanvas(std::string_view path);
922
924 void GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels);
925
927 VkSampleCountFlagBits GetMaxUsableSampleCount();
928
930 size_t LoadSkybox(std::string_view path);
932 void SetSkybox(size_t i);
933
934
935 //
938
941 {
942 return _2d._renderInfo;
943 }
944
946 {
947 return _renderInfo;
948 }
949
952 {
953 return _camera;
954 }
955
957 void Release()
958 {
959 vkDeviceWaitIdle(_device);
960 _release_swap_chain();
961 }
962
964private:
965
966 VkInstance _instance; // vk实例
967 std::vector<VkExtensionProperties> _allExtension; // 所有扩展,返回获得
968 std::vector<VkLayerProperties> _allLayer; // 所有层,返回获得
969 std::vector<const char*> _allValidationLayer; // 验证层,手动设置
970 VkPhysicalDevice _physicalDevice; // 所选物理设备
971 std::vector<VkPhysicalDevice> _allPhysicalDevice; // 所有物理设备
972 VkDevice _device; // 逻辑设备
973 VkQueue _graphicsQueue; // 图形队列
974 VkSurfaceKHR _surface; // 窗口表面
975 VkQueue _presentQueue; // 呈现队列
976 std::vector<const char*> _allDeviceExtension; // 物理设备所需扩展,手动设置
977 VkSwapchainKHR _swapChain; // 交换链
978 uint32_t _countFrame; // 交换链 frame数
979 std::vector<VkImage> _allImageSwapChain; // 交换链图像
980 VkFormat _formatSwapChainImage; // 交换链图像格式
981 VkExtent2D _extentSwapChain; // 交换链范围
982 std::vector<VkImageView> _allImageViewSwapChain; // 交换链图像视图
983 VkRenderPass _renderPass3D; // 3d渲染流程
984 VkRenderPass _renderPass2D; // 2d渲染流程
985 VkPipelineLayout _pipelineLayout; // 管线布局
986 VkPipelineLayout _pipelineLayoutBone; // 管线布局(骨骼动画)
987 VkPipeline _graphicsPipeline; // 图形管线
988 VkPipeline _graphicsPipelineBone; // 图形管线(骨骼动画)
989 std::vector<VkFramebuffer> _allFrameBufferSwapChain;// 交换链帧缓冲区
990 VkCommandPool _commandPool; // 命令池
991 std::vector<VkCommandBuffer> _allCommandBuffer; // 命令缓冲区(依赖于命令池,自动释放)
992 std::vector<VkSemaphore> _allSemaphoreImageAvailable;// 同步对象(交换链图像可用)
993 std::vector<VkSemaphore> _allSemaphoreRenderFinished;// 同步对象(绘制完成)
994 std::vector<VkFence> _allFenceInFlight; // 同步对象(绘制过程)
995 VkCommandPool _commandPoolUpload; // 命令池(上传)
996 VkQueue _transferQueue; // 传输队列
997 uint32_t _currentFrame; //当前帧
998 bool _bFrameBufferResize; //帧缓冲大小发生变化
999 VkDebugUtilsMessengerEXT _debugMessenger; //调试信使
1000 VkDescriptorSetLayout _descriptorSetLayout; //描述符集合布局
1001 VkDescriptorSetLayout _descriptorSetLayoutTex; //描述符集合布局(纹理贴图)
1002 VkDescriptorSetLayout _descriptorSetLayoutBone; //描述符集合布局(骨骼动画)
1003 std::vector<VkBuffer> _uniformBuffers; //统一缓冲
1004 std::vector<VkDeviceMemory> _uniformBuffersMemory; //统一缓冲内存
1005 VkDescriptorPool _descriptorPool; //描述符池
1006 std::vector<VkDescriptorSet> _descriptorSets; // 描述符集(ubo、matrial、pass、cascade、ibl、brdf)
1007 std::vector<VkDescriptorSet> _descriptorSetsTex; // 描述符集(纹理)
1008 std::vector<VkDescriptorSet> _descriptorSetsBone; // 描述符集(带骨骼动画)
1009 VkSampler _standardSampler; // 纹理采样器(标准)
1010 VkSampler _pointSampler; // 纹理采样器(physical、mask)
1011 VkImage _depthImage; //深度图像
1012 VkDeviceMemory _depthImageMemory; //深度图像内存
1013 VkImageView _depthImageView; //深度图像视图
1014 std::array<PushConstantData, NUM_MAX_ACTOR> _allPushConstant;//常量缓冲
1015 size_t _curPushConstant; //当前使用 常量缓冲 下标
1016 Camera* _camera; //当前摄像机(设置vp矩阵)
1017 Camera _cameraDefault; //默认相机
1018 std::vector<Texture> _allTexture3D; //3d使用的所有贴图
1019 std::unordered_map<std::string, size_t> _mapPath2Texture; //文件路径 -> 纹理下标
1020 std::vector<VkBuffer> _ubMaterial; // 材质缓冲
1021 std::vector<VkDeviceMemory> _ubMaterialMemory; // 材质缓冲内存
1022 std::vector<VkBuffer> _ubPass; // 通用缓冲
1023 std::vector<VkDeviceMemory> _ubPassMemory; // 通用缓冲内存
1024 std::vector<Material> _allMaterial; // 所有已添加材质(计数和避免重复)
1025 std::vector<VkBuffer> _ubBone; // 骨骼ub
1026 std::vector<VkDeviceMemory> _ubBoneMemory; // 骨骼ub内存
1027 std::vector<bool> _mapBoneUse; // 骨骼ub使用表
1028 std::vector<Primitive> _allPrimitive; // 所有图元
1029 VkImage _colorImage; // 离屏图像
1030 VkDeviceMemory _colorImageMemory; // 离屏图像内存
1031 VkImageView _colorImageView; // 离屏图像视图
1032 std::vector<VKRenderTarget> _allRenderTarget; // 所有rt,0为默认3d渲染使用
1033
1035 struct TextureManager
1036 {
1038 {
1040 };
1041
1043 TextureManager(VK* vk)
1044 {
1045 _mtt.Init([vk](TaskLoad& task) {
1046 Canvas* canvas = vk->GetCanvas(task._idCanvas);
1047 canvas->RealLoad(vk);
1048 }, 1);
1049 }
1050 };
1051 TextureManager _textureMgr;
1052 //---------------------灯光数据(每帧重建)----------------------------
1053 std::vector<LightDir> _allLightDir;
1054 std::vector<LightDot> _allLightDot;
1055 std::vector<LightSpot> _allLightSpot;
1056 UbPass _pass;
1057
1058 // 天空盒
1059 struct Skybox
1060 {
1061 VkPipelineLayout _pipelineLayout; // 管线布局
1062 VkPipeline _graphicsPipeline; // 图形管线
1063 VkDescriptorSetLayout _descriptorSetLayout; // 描述符布局
1064 std::vector<VkDescriptorSet> _descriptorSets; // 描述符集
1065 VkBuffer _vertexBuffer; // 顶点缓冲(每帧改变)
1066 VkDeviceMemory _vertexBufferMemory; // 顶点缓冲内存
1067 VkDeviceSize _vertexBufferSize; // 顶点缓冲大小
1068 VkBuffer _indexBuffer; // 顶点缓冲(每帧改变)
1069 VkDeviceMemory _indexBufferMemory; // 顶点缓冲内存
1070
1071 VkSampler _envSampler; // env 采样器
1072 VkSampler _iblSampler; // ibl 采样器
1073 VkSampler _brdfSampler; // brdf 采样器
1074
1075 Texture _texBrdf; // brdf
1076
1078 {
1079 Texture _texEnv; // env cube
1080 Texture _texIbl; // ibl cube
1081 std::array<Position4, 9> _sh; // 球谐环境光
1082 };
1083 std::vector<Instance> _vec;
1084 size_t _current;
1085 };
1086 Skybox _skybox;
1087
1088 // 阴影
1089 struct Shadow
1090 {
1091 VkRenderPass _renderPass;
1092 VkDescriptorSetLayout _descriptorSetLayout; // 描述符布局 set0
1093 std::vector<VkDescriptorSet> _descriptorSets; // 描述符集(ubo)
1094 VkPipelineLayout _layout;
1095 VkPipeline _pipeline;
1096 VkPipeline _pipelineBone;
1097 VkSampler _sampler; // 采样器
1098 Texture _tex;
1099
1100 std::vector<VkBuffer> _ubCsmBuffer;
1101 std::vector<VkDeviceMemory> _ubCsmMemory;
1102
1103 struct Cascade
1104 {
1105 VkImageView _imageView;
1106 VkFramebuffer _frameBuffer;
1107 };
1108 std::vector<Cascade> _cascade;
1109 };
1110 Shadow _shadow;
1111
1112 RenderInfo3D _renderInfo;
1113
1114 // 图元在描述符的实际下标如下:
1115 //index = _idPrimitive * NUM_MAX_FRAME_IN_FLIGHT + _currentFrame;
1116 VK2D _2d; //2d管线
1117 VKGfx _gfx; // gfx管线
1118 std::vector<std::vector<Model*>> _allMulModel;// 3d可绘制实例
1119
1120 void _init(GLFWwindow* window);
1121 // 检查拓展支持数
1122 void _check_extension();
1123 // 返回需要的扩展(根据验证层)
1124 std::vector<const char*> _get_required_extensions();
1125 // 创建实例
1126 void _create_instance();
1127 // 创建验证层
1128 void _check_layer();
1129 // 检查调试层支持
1130 bool _check_validation_layer();
1131
1132 //开启调试信使
1133 void _create_debug_messenger()
1134 {
1136 return;
1137 VkDebugUtilsMessengerCreateInfoEXT createInfo;
1139
1140 if (CreateDebugUtilsMessengerEXT(_instance, &createInfo,
1141 nullptr, &_debugMessenger) != VK_SUCCESS)
1142 {
1143 log_err0("开启调试信使失败!");
1144 return;
1145 }
1146 }
1147
1148 // 创建物理设备
1149 void _create_physical_device();
1150
1151 // 检查物理设备是否可用
1152 bool _is_device_suitable(VkPhysicalDevice device);
1153 // 检查物理设备扩展支持
1154 bool _check_device_extension(VkPhysicalDevice device);
1155 // 物理设备返回队列族 0.通用 1.传输
1156 bool _find_queue_families(VkPhysicalDevice device, uint32_t& index, int type = 0);
1157
1158 // 创建逻辑设备
1159 void _create_logical_device();
1160 // 创建窗口表面
1161 void _create_surface(GLFWwindow* window);
1162
1163 // 返回交换链支持细节
1164 SwapChainSupportDetails _query_swap_chain_support(VkPhysicalDevice device);
1165 // 选择交换链合适的表面格式
1166 VkSurfaceFormatKHR _choose_swap_surface_format(const std::vector<VkSurfaceFormatKHR>& availableFormats);
1167 // 选择交换链合适的呈现模式
1168 VkPresentModeKHR _choose_swap_present_mode(const std::vector<VkPresentModeKHR>& availablePresentModes);
1169
1170 // 选择交换链分辨率
1171 VkExtent2D _choose_swap_extent(const VkSurfaceCapabilitiesKHR& capabilities,
1172 GLFWwindow* window);
1173
1174 // 创建交换链
1175 void _create_swap_chain(GLFWwindow* window);
1176 // 创建交换链图像视图
1177 void _create_image_view();
1178
1179 // 创建绘图流程
1180 void _create_render_pass();
1181 // 创建图形管道
1182 void _create_pipeline_layout_3d();
1183 void _create_pipeline_layout_skybox();
1184
1185 //-------------------骨骼动画-----------------
1186 void _create_descriptor_set_layout_bone();//布局
1187 void _create_pipeline_layout_bone();//管线
1188 void _create_uniform_bone();//统一缓冲
1189
1190 void _create_ibl();
1191
1192 // 从ktx创建纹理
1193 void _create_texture_ktx(std::string_view path, Texture& tex);
1194
1195 // 创建交换链帧缓冲区
1196 void _create_frame_buffer();
1197
1198 // 创建命令池
1199 void _create_command_pool();
1200 // 创建命令缓冲区
1201 void _create_command_buffer();
1202
1203 // 创建同步对象
1204 void _create_sync_objects();
1205
1206 // 上传队列
1207 void _create_command_upload();
1208 // 记录命令
1209 void _record_command_buffer(VkCommandBuffer command_buffer, uint32_t index_image);
1210public:
1211 // 重建交换链
1213
1215 {
1216 _allLightDir.push_back(l);
1217 }
1219 {
1220 _allLightDot.push_back(l);
1221 }
1223 {
1224 _allLightSpot.push_back(l);
1225 }
1226private:
1227 //释放交换链相关资源
1228 void _release_swap_chain();
1229
1230
1231 //创建描述符布局(管线依赖)
1232 void _create_descriptor_set_layout();
1233 void _create_descriptor_set_layout_texture();
1234
1235 //创建统一缓冲
1236 void _create_uniform_buffers();
1237
1238 //更新统一缓冲
1239 void _update_uniform_buffer();
1240 void _update_uniform_light();
1241
1242 // 创建描述符池
1243 void _create_descriptor_pool();
1244
1245 // 创建描述符集
1246 void _create_descriptor_sets();
1247
1248 // 创建纹理采样器
1249 void _create_texture_sampler();
1250 // 创建深度缓存资源
1251 void _create_depth_resources();
1252 // 创建msaa资源
1253 void _create_color_resources();
1254
1255
1256 //2d管线
1257 void _create_2d();
1258 void _delete_2d();
1259
1260 // gfx管线
1261 void _create_gfx();
1262 void _delete_gfx();
1263
1264 // skybox管线
1265 void _create_skybox();
1266 void _delete_skybox();
1267 void _create_descriptor_set_layout_skybox();
1268
1269
1270 // shadow管线
1271 void _create_shadow();
1272 void _delete_shadow();
1273 void _create_render_pass_shadow();
1274
1275 VkPipelineLayout _create_pipline_layout_shadow();
1276
1277 VkPipeline _create_graphics_pipeline_shadow(
1278 std::string_view vs, std::string_view ps,
1279 VkVertexInputBindingDescription* bind_desc, VkVertexInputAttributeDescription* attr_desc,
1280 size_t num_attr, VkPipelineLayout layout);
1281 void _create_descriptor_set_layout_shadow();
1282
1283 bool _check_gfx_vertex(VertexBufferGfx::Frame& f_old);
1284
1285 //------------------------------管线-------------------------------------
1286
1287 void _create_pipeline_all();
1288 void _delete_pipeline_all();
1289
1290 void _create_pipeline_gfx();
1291 void _create_pipeline_2d();
1292 void _create_pipeline_3d();
1293 void _create_pipeline_bone();
1294 void _create_pipeline_skybox();
1295 void _create_pipeline_shadow();
1296public:
1297 // 动态参数
1299 {
1300 VkSampleCountFlagBits _msaaLevel;
1301
1303
1305 {
1306 return _currentFrame;
1307 }
1308
1309 void GfxPushDot(const VertexGfx& v)
1310 {
1311 bool opaque = isColorOpaque(v._color);
1312 auto& vec = _gfx._allVertex[0 + !opaque * NUM_GFX_HALF];
1313 vec.push_back(v);
1314 }
1315 void GfxPushLine(const VertexGfx& v0, const VertexGfx& v1)
1316 {
1317 bool opaque = isColorOpaque(v0._color) && isColorOpaque(v1._color);
1318 auto& vec = _gfx._allVertex[1 + !opaque * NUM_GFX_HALF];
1319 vec.push_back(v0);
1320 vec.push_back(v1);
1321 }
1322 void GfxPushTriangle(const VertexGfx& v0, const VertexGfx& v1, const VertexGfx& v2)
1323 {
1324 bool opaque = isColorOpaque(v0._color) && isColorOpaque(v1._color) && isColorOpaque(v2._color);
1325 auto& vec = _gfx._allVertex[2 + !opaque * NUM_GFX_HALF];
1326 vec.push_back(v0);
1327 vec.push_back(v1);
1328 vec.push_back(v2);
1329 }
1331 {
1332 bool opaque = isColorOpaque(v._color);
1333 auto& vec = _gfx._allVertex[0 + !opaque * NUM_GFX_HALF + NUM_GFX_QUAD];
1334 vec.push_back(v);
1335 }
1336 void GfxPushLine2D(const VertexGfx& v0, const VertexGfx& v1)
1337 {
1338 bool opaque = isColorOpaque(v0._color) && isColorOpaque(v1._color);
1339 auto& vec = _gfx._allVertex[1 + !opaque * NUM_GFX_HALF + NUM_GFX_QUAD];
1340 vec.push_back(v0);
1341 vec.push_back(v1);
1342 }
1343 void GfxPushTriangle2D(const VertexGfx& v0, const VertexGfx& v1, const VertexGfx& v2)
1344 {
1345 bool opaque = isColorOpaque(v0._color) && isColorOpaque(v1._color) && isColorOpaque(v2._color);
1346 auto& vec = _gfx._allVertex[2 + !opaque * NUM_GFX_HALF + NUM_GFX_QUAD];
1347 vec.push_back(v0);
1348 vec.push_back(v1);
1349 vec.push_back(v2);
1350 }
1351
1352 Coor* GetRootCoor(size_t index);
1353
1354 size_t GetMulModelSize() { return _allMulModel.size(); }
1355 std::vector<Model*>& GetMulModel(size_t i)
1356 {
1357 return _allMulModel[i];
1358 }
1359 void AddMulModel(std::vector<Model*>& vec)
1360 {
1361 _allMulModel.push_back(vec);
1362 }
1363};
1364
1365extern VK* g_vk;
1366
1367}
1368
1369
1370#endif
2d坐标系
void Init(FnDoTask fn_do_task, size_t thread_num=(size_t) std::thread::hardware_concurrency())
void UpdateTexture2D(Texture tex, const PointU &xy, Image *image, const RectU &rect)
更新纹理区域(自动生成mipmap)
static VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pDebugMessenger)
验证层代理函数
void RenderEnd()
帧尾清理工作
void _render_light(const LightSpot &l)
bool CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory)
创建缓冲区
struct dl::VK::RenderParam _param
VkDevice GetDevice()
void SetSkybox(size_t i)
设置当前天空盒
static VKAPI_ATTR VkBool32 VKAPI_CALL CallbackDebug(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)
调试回调函数
void ExportTextureCanvas(std::string_view path)
VkImageView CreateImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mip_level)
创建图像视图
size_t LoadSkybox(std::string_view path)
加载天空盒
VkCommandBuffer BeginSingleTimeCommands()
开始命令记录
Texture CreateTexture2D(const std::array< Image *, NUM_MIPMAP_2D > &vec_image)
真正的创建一个2d管线纹理
VkFormat FindDepthFormat()
查找支持的深度测试
size_t GetMulModelSize()
void GfxPushTriangle(const VertexGfx &v0, const VertexGfx &v1, const VertexGfx &v2)
DebugView3D GetDebugView()
void GfxPushTriangle2D(const VertexGfx &v0, const VertexGfx &v1, const VertexGfx &v2)
void DeleteModel(Model *model)
删除模型
void AddMulModel(std::vector< Model * > &vec)
void UpdateUboBone(size_t id, std::vector< Matrix4 > &trans)
更新骨骼ubo(实例id)
size_t GetCanvasSize()
void _render_light(const LightDir &l)
void GfxPushDot2D(const VertexGfx &v)
uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
查找内存类型
Camera * GetCamera()
返回当前相机
std::vector< Model * > & GetMulModel(size_t i)
bool CreateVertexBufferCPU(size_t vertex_num, VkBuffer &vertexBuffer, VkDeviceMemory &vertexBufferMemory, VkDeviceSize &bufferSize)
创建顶点缓冲(CPU可访问,用于2d管线)
void CreateCanvasImage(size_t tex_id, const std::array< Image *, NUM_MIPMAP_2D > &vec_image)
void CreateCanvas(size_t id, Texture tex, std::string_view path_tex_full)
创建Canvas(2d管线资源)
void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, uint32_t mip_level)
复制缓冲区 到 图像
void _rebuild_swap_chain(GLFWwindow *window)
PushConstantData * GetPushConstant(size_t id)
返回 推送常量
void _render_light(const LightDot &l)
size_t CreateTexture(std::string_view path_name, bool srgb=true)
创建Texture
uint32_t GetCurrentFrame()
void CopyBufferToImageMulti(const std::array< VkBuffer, NUM_MIPMAP_2D > &vec_buffer, VkImage image, const std::array< Size, NUM_MIPMAP_2D > &vec_size)
复制缓冲区 到 图像(mipmap)
VkFormat FindSupportedFormat(const std::vector< VkFormat > &candidates, VkImageTiling tiling, VkFormatFeatureFlags features)
查找支持的格式
size_t CreateTextureReal(Image *image, bool srgb, bool delete_image)
真正的创建一个纹理,失败返回0
const RenderInfo2D & GetRenderInfo2D()
返回绘制信息
void CreateVertexBufferGPU(const std::vector< T > &vertices, VkBuffer &vertexBuffer, VkDeviceMemory &vertexBufferMemory)
创建顶点缓冲(CPU不可访问,用于模型)
Canvas * GetCanvasByTexture(size_t tex_id)
void CreateCanvasImageKtx(size_t tex_id, std::string_view path_name, std::string_view path_tex_full)
void GfxPushDot(const VertexGfx &v)
size_t CreateMaterial(Material &m)
创建一个材质(检查重复)
void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo)
填充调试信使结构
void ScreenShot(std::string_view path_name)
void RenderModel(VkCommandBuffer command_buffer, Model *model, size_t shadow)
绘制模型
void GfxPushLine(const VertexGfx &v0, const VertexGfx &v1)
void SetFrameBufferResize()
设置帧缓冲大小发生变化
size_t GetPushConstantNext()
返回 下一个可用推送常量
void CreateCanvasRenderTarget(size_t rt_id, VKRenderTarget &rt)
void SetUboBoneUse(size_t id)
设置蒙皮id占用(描述符创建时就已经映射)
void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)
复制缓冲区
size_t CreateRenderTarget()
bool HasStencilComponent(VkFormat format)
格式含有模板通道
bool CreateRenderTargetReal(size_t i, VKRenderTarget &rt)
Canvas * GetCanvas(size_t id)
VK(GLFWwindow *window)
size_t GetUboBoneFree()
返回可用蒙皮id(注意设置不可用)
void SetUboBoneFree(size_t id)
设置蒙皮id可用
void TransitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mip_level)
转换图像布局
Array< float, 4 > Viewport
const RenderInfo3D & GetRenderInfo3D()
void Render(GLFWwindow *window)
绘制一帧
void SetDebugView(DebugView3D type)
size_t CreatePrimitive(ModelMaterial &m)
创建一个图元(材质)
static void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks *pAllocator)
验证层代理函数
Model * CreateModel(ModelObject *object)
创建模型 ModelObject -> Model
Canvas * GetCanvasByRenderTarget(size_t rt_id)
void CreateImage(uint32_t w, uint32_t h, uint32_t mip_level, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage &image, VkDeviceMemory &imageMemory, uint32_t layers=1)
创建图像
void EndSingleTimeCommands(VkCommandBuffer commandBuffer)
结束命令记录
void GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels)
生成mipmap
void CreateIndexBuffer(const std::vector< T > &indices, VkBuffer &indexBuffer, VkDeviceMemory &indexBufferMemory)
创建索引缓冲(CPU不可访问)
void UpdateCanvasRenderTarget(size_t rt_id, VKRenderTarget &rt)
void Update()
一帧逻辑(无需等待上帧完成的操作)
VkShaderModule CreateShaderModule(Buffer &buf)
创建shader模块
void UpdateCanvasDescriptor(Canvas *canvas)
void GfxPushLine2D(const VertexGfx &v0, const VertexGfx &v1)
void Release()
释放操作起始
Coor * GetRootCoor(size_t index)
VkSampleCountFlagBits GetMaxUsableSampleCount()
最大msaa采样数
void ExportTexture(Texture tex, std::string_view path_name)
安卓相关
表示一段内存
摄像机(3d)
图像对象
灯光对象
日志系统
#define log_warn(...)
#define log_msg(...)
矩阵(列存储)
模型类
中转模型数据
平台宏
绘图相关常量定义
2d绘图元素
多线程任务
常用类型
复用容器,避免元素重分配,但会一直占用内存
constexpr size_t NUM_MAX_JOINT
constexpr size_t NUM_GFX_QUAD
constexpr size_t NUM_MAX_PRIMITIVE
定义 dl_vk.h:99
constexpr VkFormat FORMAT_SHADOW_IMAGE
constexpr bool OPEN_SAMPLE_SHADING
constexpr VkFormat DL_VK_FORMAT_UNORM
constexpr bool USE_MAPPED_2D_UBO
constexpr size_t NUM_SHADOW_CASCADE
VK * g_vk
constexpr size_t INDEX_GFX_2D_NORMAL_DOT
constexpr size_t NUM_START_2D_VERTEX
constexpr size_t INDEX_GFX_2D_TRANS_DOT
constexpr unsigned TIME_FREE_TEXTURE_2D
constexpr VkFormat DL_VK_FORMAT_SURFACE
constexpr size_t NUM_MAX_ROOT_COOR
constexpr size_t NUM_GFX_HALF
void log(std::string_view str, DL_SOURCE_LOCATION)
以当前设置输出
constexpr size_t INDEX_GFX_2D_TRANS_TRIANGLE
constexpr size_t NUM_MAX_LIGHT_DOT
constexpr VkFormat DL_VK_FORMAT_SRGB
void log_err0(std::string_view str, DL_SOURCE_LOCATION)
Point2U PointU
constexpr size_t INDEX_GFX_3D_NORMAL_DOT
void log_info0(std::string_view str, DL_SOURCE_LOCATION)
void log_test0(std::string_view str, DL_SOURCE_LOCATION)
constexpr uint32_t SIZE_SHADOW_IMAGE
Matrix< Float, 4, 4 > Matrix4
constexpr VkFormat DL_VK_FORMAT_SRGB_TEXTURE
Array< Float, 3 > Position3
constexpr size_t INDEX_GFX_2D_NORMAL_TRIANGLE
constexpr VkFormat DL_VK_FORMAT_UNORM_TEXTURE
constexpr size_t INDEX_GFX_3D_NORMAL_LINE
constexpr size_t NUM_MAX_LIGHT_SPOT
constexpr size_t NUM_MAX_LIGHT_DIR
constexpr size_t NUM_GFX_VERTEX
Array< float, 4 > Color
constexpr size_t NUM_GFX
Vector2< uint32_t, unsigned > Image
constexpr size_t NUM_MAX_MATERIAL
Point4 Rect
constexpr bool OPEN_FILL_MODE_NON_SOLID
Point4U RectU
constexpr size_t INDEX_GFX_3D_TRANS_TRIANGLE
constexpr size_t NUM_2D_INDEX
constexpr size_t INDEX_GFX_3D_TRANS_DOT
constexpr size_t INDEX_GFX_3D_NORMAL_TRIANGLE
constexpr size_t INDEX_GFX_3D_TRANS_LINE
bool isColorOpaque(const Color &col)
不透明(a通道为1)
constexpr size_t NUM_MAX_LIGHT
constexpr size_t NUM_MAX_DRAW_CALL_2D
constexpr size_t NUM_2D_SAMPLER
constexpr bool ENABLE_VALIDATION_LAYERS
DebugView3D
调试绘图3d
constexpr size_t NUM_MAX_ACTOR
constexpr size_t NUM_MAX_BONE
constexpr size_t INDEX_GFX_2D_NORMAL_LINE
constexpr size_t INDEX_GFX_2D_TRANS_LINE
constexpr size_t NUM_MAX_2D_SPRITE
材质(pbr 金属度/粗糙度)
std::vector< VkPresentModeKHR > _presentModes
定义 dl_vk.h:60
std::vector< VkSurfaceFormatKHR > _formats
定义 dl_vk.h:59
VkSurfaceCapabilitiesKHR _capabilities
定义 dl_vk.h:58
VkImageView _imageView
定义 dl_vk.h:68
void Delete(VkDevice device)
定义 dl_vk.h:88
uint32_t _width
定义 dl_vk.h:71
VkDeviceMemory _memory
定义 dl_vk.h:67
uint32_t _mipLevel
定义 dl_vk.h:70
bool IsVaild()
定义 dl_vk.h:83
VkImage _image
定义 dl_vk.h:66
uint32_t _height
定义 dl_vk.h:72
std::vector< Sprite * > _allSprite
std::string _pathTextureFull
void RealLoad(VK *vk)
std::vector< VkDeviceMemory > _vertexBufferMemory
Texture _textureFast
unsigned _textureState
std::mutex _mutex
std::vector< size_t > _numVertex
unsigned _tkcUsed
void TryRelase(VK *vk, unsigned tkc)
std::vector< VkDeviceSize > _vertexBufferSize
void Delete(VkDevice device)
void TryLoad(VK *vk)
std::vector< Sprite * > _allSpriteTrans
std::vector< VkBuffer > _vertexBuffer
Sprite::Sampler _sampler
bool operator==(const DrawCall &b) const
Sprite::Blend _blend
Viewport * _viewport
bool operator==(const DrawCallList &b)
std::vector< Sprite * > _listSpr
DrawCallList _dcl
bool operator==(const DrawCallZ &b)
VkSampleCountFlagBits _msaaLevel
VkFramebuffer _frameBuffer
std::array< Position4, 9 > _sh
std::array< Matrix4, NUM_SHADOW_CASCADE > _viewProj
Position3 _camPos
Matrix4 _trans[NUM_MAX_JOINT]
uint32_t _samplerIndex
std::vector< VkDeviceMemory > _uniformBuffersMemory
RenderInfo2D _renderInfo
std::vector< void * > _uniformBuffersMapped
std::vector< VK::DrawCall > _vecDcTrans
std::array< CBO, NUM_MAX_ROOT_COOR > _allCBO
VkDescriptorSetLayout _descriptorSetLayout1
VkDescriptorSetLayout _descriptorSetLayout0
VkPipeline _graphicsPipelineTrans
VkSampler _textureSampler
std::vector< VkDescriptorSet > _descriptorSets0
VkSampler _textureSamplerPixel
VkPipeline _graphicsPipeline
DrawCallZ _tempDcListZ
VkPipeline _graphicsPipelineGray
std::vector< VK::DrawCall > _vecDc
std::vector< VkDescriptorSet > _descriptorSets1
size_t _curPushConstant
std::array< Coor *, NUM_MAX_ROOT_COOR > _allRootCoor
VkDeviceMemory _indexBufferMemory
VkDescriptorPool _descriptorPool
std::unordered_map< size_t, Canvas * > _allCanvas
VectorReuse< DrawCallList > _vecDcList
VectorReuse< DrawCallZ > _vecDcListZ
VkBuffer _indexBuffer
VkPipeline _graphicsPipelineEffect
std::array< Matrix4, NUM_MAX_ROOT_COOR > _allRootCoorMat
Matrix4 _mat2D
std::vector< VkBuffer > _uniformBuffers
VkSampler _textureSamplerUI
VkPipelineLayout _pipelineLayout
std::vector< VkDeviceMemory > _uniformBuffersMemory
VkDescriptorPool _descriptorPool
std::array< VkPipeline, NUM_GFX_HALF > _vecGraphicsPipeline
VkPipelineLayout _pipelineLayout
std::vector< VkDescriptorSet > _descriptorSets
VkDescriptorSetLayout _descriptorSetLayout
std::array< std::vector< VertexGfx >, NUM_GFX > _allVertex
std::vector< VkBuffer > _uniformBuffers
std::array< VertexBufferGfx, NUM_GFX > _arrVB
VkFramebuffer _frameBuffer
void Delete(VkDevice device)
void Unlock(VkDevice device)
void Delete(VkDevice device)
void Lock(VkDevice device)
std::vector< Frame > _frame
void Delete(VkDevice device)
Frame & operator[](size_t i)