14#ifndef DL_DISABLE_RENDER
17#include <unordered_map>
21#if (DL_PLATFORM != DL_PLATFORM_ANDROID)
22#define GLFW_INCLUDE_VULKAN
23#include <GLFW/glfw3.h>
25#include <vulkan/vulkan.h>
26#include <vulkan/vulkan_android.h>
30#if DL_PLATFORM == DL_PLATFORM_APPLE
31#include <vulkan/vulkan.h>
32#include <vulkan/vulkan_beta.h>
85 return _image != VK_NULL_HANDLE;
90 vkDestroyImageView(device,
_imageView,
nullptr);
91 vkDestroyImage(device,
_image,
nullptr);
92 vkFreeMemory(device,
_memory,
nullptr);
148#if (DL_PLATFORM == DL_PLATFORM_WIN32)
297 vk->_textureMgr._mtt.AddTask(task);
477 _frame.resize(vk->_countFrame);
487 for (
size_t i = 0; i <
_frame.size(); ++i)
513 std::array<VertexBufferGfx, NUM_GFX>
_arrVB;
536 _bFrameBufferResize{ false },
539 _allValidationLayer =
541 "VK_LAYER_KHRONOS_validation"
543 _allDeviceExtension =
545 VK_KHR_SWAPCHAIN_EXTENSION_NAME
547#if DL_PLATFORM == DL_PLATFORM_APPLE
548 _allDeviceExtension.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
574 _curPushConstant = 1;
584 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
585 VkDebugUtilsMessageTypeFlagsEXT messageType,
586 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
589 if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
591 else if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
598 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
599 const VkAllocationCallbacks* pAllocator,
600 VkDebugUtilsMessengerEXT* pDebugMessenger)
602 auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance,
"vkCreateDebugUtilsMessengerEXT");
604 return func(instance, pCreateInfo, pAllocator, pDebugMessenger);
606 return VK_ERROR_EXTENSION_NOT_PRESENT;
610 VkDebugUtilsMessengerEXT debugMessenger,
611 const VkAllocationCallbacks* pAllocator)
613 auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance,
"vkDestroyDebugUtilsMessengerEXT");
615 func(instance, debugMessenger, pAllocator);
627 VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
628 VkBuffer& buffer, VkDeviceMemory& bufferMemory);
632 void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
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);
648 template <
typename T>
650 VkBuffer& vertexBuffer,
651 VkDeviceMemory& vertexBufferMemory)
653 VkDeviceSize bufferSize =
sizeof(
T) * vertices.size();
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);
662 vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data);
663 memcpy(data, vertices.data(), (
size_t)bufferSize);
664 vkUnmapMemory(_device, stagingBufferMemory);
667 VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
668 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
669 vertexBuffer, vertexBufferMemory);
671 CopyBuffer(stagingBuffer, vertexBuffer, bufferSize);
673 vkDestroyBuffer(_device, stagingBuffer,
nullptr);
674 vkFreeMemory(_device, stagingBufferMemory,
nullptr);
679 template <
typename T>
681 VkBuffer& vertexBuffer, VkDeviceMemory& vertexBufferMemory, VkDeviceSize& bufferSize)
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);
701 void CreateIndexBuffer(
const std::vector<T>& indices, VkBuffer& indexBuffer, VkDeviceMemory& indexBufferMemory)
703 VkDeviceSize bufferSize =
sizeof(
T) * indices.size();
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);
712 vkMapMemory(_device, stagingBufferMemory, 0, bufferSize, 0, &data);
713 memcpy(data, indices.data(), (
size_t)bufferSize);
714 vkUnmapMemory(_device, stagingBufferMemory);
717 VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
718 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
719 indexBuffer, indexBufferMemory);
721 CopyBuffer(stagingBuffer, indexBuffer, bufferSize);
723 vkDestroyBuffer(_device, stagingBuffer,
nullptr);
724 vkFreeMemory(_device, stagingBufferMemory,
nullptr);
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);
737 VkImageAspectFlags aspectFlags, uint32_t mip_level);
751 VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mip_level);
756 VkImageTiling tiling, VkFormatFeatureFlags features);
763 return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
771 for (
size_t i = 0; i < _allMaterial.size(); ++i)
773 if (_allMaterial[i] == m)
776 size_t id = _allMaterial.size();
783 vkMapMemory(_device, _ubMaterialMemory[
id], 0,
sizeof(m), 0, &data);
784 memcpy(data, &m,
sizeof(m));
785 vkUnmapMemory(_device, _ubMaterialMemory[
id]);
787 _allMaterial.push_back(m);
804 vkDestroyBuffer(_device, model->_indexBuffer,
nullptr);
805 vkFreeMemory(_device, model->_indexBufferMemory,
nullptr);
807 vkDestroyBuffer(_device, model->_vertexBuffer,
nullptr);
808 vkFreeMemory(_device, model->_vertexBufferMemory,
nullptr);
815 return _curPushConstant++;
820 if (
id >= _allPushConstant.size())
822 log(fmt::format(
"超过 推送常量区上限:{}", _allPushConstant.size()));
825 return &_allPushConstant[id];
834 size_t index =
id * _countFrame + _currentFrame;
837 vkMapMemory(_device, _ubBoneMemory[index], 0, size, 0, &data);
838 memcpy(data, trans.data(), size);
839 vkUnmapMemory(_device, _ubBoneMemory[index]);
845 for (
size_t i = 0; i < _mapBoneUse.size(); ++i)
856 assert(_mapBoneUse[
id]);
857 _mapBoneUse[id] =
false;
862 assert(!_mapBoneUse[
id]);
863 _mapBoneUse[id] =
true;
868 _pass._debugView = (float)type;
904 return _2d._allCanvas.size();
924 void GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels);
942 return _2d._renderInfo;
959 vkDeviceWaitIdle(_device);
960 _release_swap_chain();
966 VkInstance _instance;
967 std::vector<VkExtensionProperties> _allExtension;
968 std::vector<VkLayerProperties> _allLayer;
969 std::vector<const char*> _allValidationLayer;
970 VkPhysicalDevice _physicalDevice;
971 std::vector<VkPhysicalDevice> _allPhysicalDevice;
973 VkQueue _graphicsQueue;
974 VkSurfaceKHR _surface;
975 VkQueue _presentQueue;
976 std::vector<const char*> _allDeviceExtension;
977 VkSwapchainKHR _swapChain;
978 uint32_t _countFrame;
979 std::vector<VkImage> _allImageSwapChain;
980 VkFormat _formatSwapChainImage;
981 VkExtent2D _extentSwapChain;
982 std::vector<VkImageView> _allImageViewSwapChain;
983 VkRenderPass _renderPass3D;
984 VkRenderPass _renderPass2D;
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;
1007 std::vector<VkDescriptorSet> _descriptorSetsTex;
1008 std::vector<VkDescriptorSet> _descriptorSetsBone;
1009 VkSampler _standardSampler;
1010 VkSampler _pointSampler;
1011 VkImage _depthImage;
1012 VkDeviceMemory _depthImageMemory;
1013 VkImageView _depthImageView;
1014 std::array<PushConstantData, NUM_MAX_ACTOR> _allPushConstant;
1015 size_t _curPushConstant;
1018 std::vector<Texture> _allTexture3D;
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;
1026 std::vector<VkDeviceMemory> _ubBoneMemory;
1027 std::vector<bool> _mapBoneUse;
1028 std::vector<Primitive> _allPrimitive;
1029 VkImage _colorImage;
1030 VkDeviceMemory _colorImageMemory;
1031 VkImageView _colorImageView;
1032 std::vector<VKRenderTarget> _allRenderTarget;
1035 struct TextureManager
1043 TextureManager(
VK* vk)
1051 TextureManager _textureMgr;
1053 std::vector<LightDir> _allLightDir;
1054 std::vector<LightDot> _allLightDot;
1055 std::vector<LightSpot> _allLightSpot;
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;
1071 VkSampler _envSampler;
1072 VkSampler _iblSampler;
1073 VkSampler _brdfSampler;
1083 std::vector<Instance> _vec;
1091 VkRenderPass _renderPass;
1092 VkDescriptorSetLayout _descriptorSetLayout;
1093 std::vector<VkDescriptorSet> _descriptorSets;
1094 VkPipelineLayout _layout;
1095 VkPipeline _pipeline;
1096 VkPipeline _pipelineBone;
1100 std::vector<VkBuffer> _ubCsmBuffer;
1101 std::vector<VkDeviceMemory> _ubCsmMemory;
1108 std::vector<Cascade> _cascade;
1118 std::vector<std::vector<Model*>> _allMulModel;
1122 void _check_extension();
1124 std::vector<const char*> _get_required_extensions();
1126 void _create_instance();
1128 void _check_layer();
1130 bool _check_validation_layer();
1133 void _create_debug_messenger()
1137 VkDebugUtilsMessengerCreateInfoEXT createInfo;
1141 nullptr, &_debugMessenger) != VK_SUCCESS)
1149 void _create_physical_device();
1152 bool _is_device_suitable(VkPhysicalDevice device);
1154 bool _check_device_extension(VkPhysicalDevice device);
1156 bool _find_queue_families(VkPhysicalDevice device, uint32_t& index,
int type = 0);
1159 void _create_logical_device();
1161 void _create_surface(GLFWwindow* window);
1164 SwapChainSupportDetails _query_swap_chain_support(VkPhysicalDevice device);
1166 VkSurfaceFormatKHR _choose_swap_surface_format(
const std::vector<VkSurfaceFormatKHR>& availableFormats);
1168 VkPresentModeKHR _choose_swap_present_mode(
const std::vector<VkPresentModeKHR>& availablePresentModes);
1171 VkExtent2D _choose_swap_extent(
const VkSurfaceCapabilitiesKHR& capabilities,
1172 GLFWwindow* window);
1175 void _create_swap_chain(GLFWwindow* window);
1177 void _create_image_view();
1180 void _create_render_pass();
1182 void _create_pipeline_layout_3d();
1183 void _create_pipeline_layout_skybox();
1186 void _create_descriptor_set_layout_bone();
1187 void _create_pipeline_layout_bone();
1188 void _create_uniform_bone();
1193 void _create_texture_ktx(std::string_view path, Texture& tex);
1196 void _create_frame_buffer();
1199 void _create_command_pool();
1201 void _create_command_buffer();
1204 void _create_sync_objects();
1207 void _create_command_upload();
1209 void _record_command_buffer(VkCommandBuffer command_buffer, uint32_t index_image);
1216 _allLightDir.push_back(l);
1220 _allLightDot.push_back(l);
1224 _allLightSpot.push_back(l);
1228 void _release_swap_chain();
1232 void _create_descriptor_set_layout();
1233 void _create_descriptor_set_layout_texture();
1236 void _create_uniform_buffers();
1239 void _update_uniform_buffer();
1240 void _update_uniform_light();
1243 void _create_descriptor_pool();
1246 void _create_descriptor_sets();
1249 void _create_texture_sampler();
1251 void _create_depth_resources();
1253 void _create_color_resources();
1265 void _create_skybox();
1266 void _delete_skybox();
1267 void _create_descriptor_set_layout_skybox();
1271 void _create_shadow();
1272 void _delete_shadow();
1273 void _create_render_pass_shadow();
1275 VkPipelineLayout _create_pipline_layout_shadow();
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();
1283 bool _check_gfx_vertex(VertexBufferGfx::Frame& f_old);
1287 void _create_pipeline_all();
1288 void _delete_pipeline_all();
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();
1306 return _currentFrame;
1312 auto& vec = _gfx._allVertex[0 + !opaque *
NUM_GFX_HALF];
1318 auto& vec = _gfx._allVertex[1 + !opaque *
NUM_GFX_HALF];
1325 auto& vec = _gfx._allVertex[2 + !opaque *
NUM_GFX_HALF];
1357 return _allMulModel[i];
1361 _allMulModel.push_back(vec);
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 _render_light(const LightSpot &l)
bool CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory)
创建缓冲区
struct dl::VK::RenderParam _param
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()
查找支持的深度测试
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)
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)
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)
Coor * GetRootCoor(size_t index)
VkSampleCountFlagBits GetMaxUsableSampleCount()
最大msaa采样数
void ExportTexture(Texture tex, std::string_view path_name)
constexpr size_t NUM_MAX_JOINT
constexpr size_t NUM_GFX_QUAD
constexpr size_t NUM_MAX_PRIMITIVE
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
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)
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
Vector2< uint32_t, unsigned > Image
constexpr size_t NUM_MAX_MATERIAL
constexpr bool OPEN_FILL_MODE_NON_SOLID
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
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
std::vector< VkPresentModeKHR > _presentModes
std::vector< VkSurfaceFormatKHR > _formats
VkSurfaceCapabilitiesKHR _capabilities
void Delete(VkDevice device)
std::vector< Sprite * > _allSprite
std::string _pathTextureFull
std::vector< VkDeviceMemory > _vertexBufferMemory
std::vector< size_t > _numVertex
void TryRelase(VK *vk, unsigned tkc)
std::vector< VkDeviceSize > _vertexBufferSize
void Delete(VkDevice device)
std::vector< Sprite * > _allSpriteTrans
std::vector< VkBuffer > _vertexBuffer
bool operator==(const DrawCall &b) const
bool operator==(const DrawCallList &b)
std::vector< Sprite * > _listSpr
bool operator==(const DrawCallZ &b)
VkSampleCountFlagBits _msaaLevel
VkFramebuffer _frameBuffer
std::array< Position4, 9 > _sh
std::array< Matrix4, NUM_SHADOW_CASCADE > _viewProj
Matrix4 _trans[NUM_MAX_JOINT]
std::vector< VkDeviceMemory > _uniformBuffersMemory
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
VkPipeline _graphicsPipelineGray
std::vector< VK::DrawCall > _vecDc
std::vector< VkDescriptorSet > _descriptorSets1
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
VkPipeline _graphicsPipelineEffect
std::array< Matrix4, NUM_MAX_ROOT_COOR > _allRootCoorMat
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)
VkDeviceSize _vertexBufferSize
void Lock(VkDevice device)
VkDeviceMemory _vertexBufferMemory
std::vector< Frame > _frame
void Delete(VkDevice device)
Frame & operator[](size_t i)