* renderTarget基础完成,拆分2d和3d渲染

This commit is contained in:
2026-06-25 18:11:42 +08:00
parent b6bd7c2b27
commit 28fede2dd4
9 changed files with 309 additions and 103 deletions
+50 -12
View File
@@ -10,6 +10,8 @@
#include "system/dl_audio.h"
#include "render/dl_render_def.h"
#include "io/dl_input.h"
#include "system/dl_engine.h"
#include "system/dl_system.h"
namespace dl
{
@@ -339,6 +341,31 @@ gcSprite Factory::CreateSprite(std::string_view name, size_t index /*= 0*/)
return CreateSprite(GetSpriteId(name, index));
}
dl::gcSprite Factory::CreateSprite(size_t rt_id)
{
auto spr = get_gc<Sprite>();
spr->_id._tex = rt_id;
spr->_id._rect = (size_t)-1;
spr->_bRenderTarget = true;
spr->_quad = createQuad(g_system->GetWindowSize(), false);
spr->_order = Z_DEFAULT_RENDER_TARGET;
for (int i = 0; i != 4; ++i)
{
spr->_col[i] = ColorDef::WHITE;
}
spr->_uv[0] = { 0.0f, 0.0f };
spr->_uv[1] = { 1.0f, 0.0f };
spr->_uv[2] = { 1.0f, 1.0f };
spr->_uv[3] = { 0.0f, 1.0f };
#ifndef NDEBUG
spr->_name = fmt::format("RenderTarget: {}", rt_id);
#endif
return spr;
}
bool Factory::RegisterSprite(std::string_view name, size_t index, Image* img, const Position& anchor)
{
if (!img)
@@ -839,19 +866,18 @@ std::optional<Color> Factory::GetColorCheck(std::string_view name)
void Factory::ExportTexture2D()
{
for(size_t i = 0; i < g_vk->GetCanvasSize(); ++i)
{
VK::Canvas* canvas = g_vk->GetCanvas(i);
std::string str = fmt::format("{}{}.png", _strPathTemp, i);
g_vk->ExportTexture(canvas->_texture, str);
}
g_vk->ExportTextureCanvas(_strPathTemp);
}
void Factory::_render_sprite(Sprite* spr)
{
const SpriteID& id = g_factory->GetImp()->_idTrans;
VK::Canvas* canvas = g_vk->GetCanvas(spr->_id._tex);
VK::Canvas* canvas = nullptr;
if (!spr->_bRenderTarget)
canvas = g_vk->GetCanvasByTexture(spr->_id._tex);
else
canvas = g_vk->GetCanvasByRenderTarget(spr->_id._tex);
assert(canvas);
if (spr->_id._rect == -1
@@ -943,6 +969,17 @@ void Factory::_clear_render()
_vecAnimation.clear();
}
void Factory::_render_rt()
{
if(Engine::GetParamRef()._show3D)
_sprRenderTarget0->Render();
}
void Factory::_resize()
{
_sprRenderTarget0->SetQuad(createQuad(g_system->GetWindowSize(), false));
}
void Factory::_init_path()
{
if (!_bSetPath)
@@ -977,9 +1014,10 @@ void Factory::_init_path()
void Factory::_init_defualt_res()
{
// 先使用一下,保证gcSprite后于gcText析构
gcSprite spr = CreateSpriteDefault();
spr->SetColor(ColorDef::RED);
//gcSprite spr = CreateSpriteDefault();
//spr->SetColor(ColorDef::RED);
_sprRenderTarget0 = CreateSprite(0);
// 默认颜色
AddColor("red", ColorDef::RED);
@@ -1172,14 +1210,14 @@ bool FactoryImp::_reg_image(Image* image_src, unsigned border, size_t& id_tex, s
size_big >>= 1;
assert(size_big);
}
g_vk->CreateCanvas(id_tex, vec_image);
g_vk->CreateCanvasImage(id_tex, vec_image);
for (size_t i = 0; i < vec_image.size(); ++i)
{
delete vec_image[i];
}
}
Texture tex = g_vk->GetCanvas(id_tex)->_texture;
Texture tex = g_vk->GetCanvasByTexture(id_tex)->_texture;
g_vk->UpdateTexture2D(tex, Align::GetLT(rect),
image, createRectU(image->GetSize()));
@@ -1309,7 +1347,7 @@ void Factory::_load_sprite_binary()
map_tex_id[name][i] = _imp->_numTexStatic;
log_msg("创建显存2d纹理:{},{}", _imp->_numTexStatic, path_out);
//创建纹理资源(创建Canvas,并创建纹理)
g_vk->CreateCanvas(_imp->_numTexStatic++, vec_image);
g_vk->CreateCanvasImage(_imp->_numTexStatic++, vec_image);
}
for (size_t j = 0; j < vec_image.size(); ++j)
{
+10
View File
@@ -217,6 +217,11 @@ public:
std::string_view name,
std::size_t index = 0);
/**
* @brief 创建一个精灵
* @param[in] rt_id RenderTarget的id
*/
gcSprite CreateSprite(size_t rt_id);
/**
* @brief 创建一个精灵,随机选中下标
* @param[in] name 名字,例如“ui.btn0”
*/
@@ -494,10 +499,15 @@ private:
std::vector<gcSprite> _vecSprite;
std::vector<gcText> _vecText;
std::vector<gcAnimation> _vecAnimation;
// 默认RenderTarget精灵
gcSprite _sprRenderTarget0;
void _auto_render();
void _clear_render();
void _render_rt();
void _resize();
//init之前会调用一次
void _init_path();
void _init_defualt_res();//初始化默认资源
+7 -7
View File
@@ -57,12 +57,12 @@ public:
};
//精灵信息(创建一个精灵必要的信息,通过SpriteID获得)
struct SpriteInfo
{
RectU _rect;//在大图区域
UV _uv[4];//计算出的uv
Color _color;//默认颜色
Position _anchor;//锚点
bool _bRightAngle;//是否顺时针旋转过(只影响uv)
{
RectU _rect; // 在大图区域
UV _uv[4]; // 计算出的uv
Color _color; // 默认颜色
Position _anchor; // 锚点
bool _bRightAngle; // 是否顺时针旋转过(只影响uv)
};
// 一个图片路径生成的所有精灵信息
struct SpriteGroup
@@ -80,7 +80,7 @@ public:
SpriteID _idTrans;// 半透明图像注册起始 id
SpriteID _idSolid;// 纯色 id
SpriteID _idSolidTrans;// 半透明纯色 id
std::size_t _numTexStatic;// 静态纹理数量
size_t _numTexStatic;// 静态纹理数量
// 计算uv
void _rect_to_uv(const RectU& rect, UV* uv, bool right_angle = false);
+31
View File
@@ -0,0 +1,31 @@
/**
* @file dl_render_target.h
* @brief 渲染目标 绘制到纹理(3d)
*
*
* @version 1.0
* @author lveyou
* @date 26-06-25
*
* @note 0为3d渲染默认绘制目标,可自行创建更多
*/
#pragma once
#include "dl_type.h"
namespace dl
{
//! 渲染目标
class RenderTarget
{
friend class Factory;
size_t GetId() { return _id; }
private:
RenderTarget() :_id{ -1 } {}
size_t _id;
};
}
+9 -6
View File
@@ -31,7 +31,9 @@ constexpr float Z_DEFAULT_UI = 0.6f;
// ui系统使用
constexpr float Z_DEFAULT_PANEL = 0.7f;
// 背景
constexpr float Z_DEFAULT_BG = 0.99f;
constexpr float Z_DEFAULT_BG = 0.98f;
// RenderTarget
constexpr float Z_DEFAULT_RENDER_TARGET = 0.99f;
constexpr Float LENGTH_NORMAL = 32.0f;
@@ -44,8 +46,8 @@ using UV = Array<float, 2>;
//! 精灵id
struct SpriteID
{
std::size_t _tex; //!< 纹理下标
std::size_t _rect;//!< 区域下标
std::size_t _tex; //!< 纹理下标 或 RenderTarget下标(由_bRenderTarget控制)
std::size_t _rect; //!< 区域下标
SpriteID() :
_tex{},
_rect{}
@@ -238,6 +240,7 @@ private:
_blend{ 0 },
_bright{ 1.0f },
_ui(false),
_bRenderTarget{ false },
_bOwnCoor{ false },
_bRoundPixel{ true },
_bRender{}
@@ -254,14 +257,14 @@ private:
unsigned _sampler;
unsigned _blend;
float _bright; // 亮度
float _order;// 与z等价
//id
SpriteID _id;// 1为纹理区域,可以为-1代表失效(手动指定uv的情况)
SpriteID _id;// _rect为纹理区域,-1代表失效(手动指定uv的情况)
float _order;// 与z等价
bool _bRenderTarget;
bool _ui;// 影响isPickup,防止穿透
bool _bOwnCoor;// 拥有coor,为真时析构会delete coor
bool _bRoundPixel;// 像素取整
// -------------------------temp 不复制的属性----------------------
+2
View File
@@ -181,6 +181,7 @@ void System::Start(const ParamWindow& param)
g_scene->_update();
if (_funcRun)
_funcRun();//帧函数
g_factory->_render_rt();
if (_lua._funcRun)
g_lua->ExcuteFunction(_lua._funcRun);
@@ -607,6 +608,7 @@ void System::_resize()
if (g_vk)
g_vk->SetFrameBufferResize();
g_ui->_resize();
g_factory->_resize();
}
+1
View File
@@ -198,6 +198,7 @@ public:
//! 返回引擎运行状态
SystemStep GetStep() { return _step; }
//! 硬件码(md5 长度32)
std::string GetHardwareId();
+181 -68
View File
@@ -23,6 +23,8 @@ constexpr uint32_t BINDING_INDEX_IBL = 4;
constexpr uint32_t BINDING_INDEX_BRDF = 5;
constexpr uint32_t BINDING_INDEX_SHADOW = 6;
constexpr size_t CANVAS_ID_RENDER_TARGET_MAX = 16;
void VK::_init(GLFWwindow* window)
{
_curPushConstant = 0;
@@ -105,6 +107,7 @@ void VK::_init(GLFWwindow* window)
_create_pipeline_all();
size_t i = CreateRenderTarget();
assert(i == 0);
}
void VK::_check_extension()
@@ -1775,6 +1778,11 @@ void VK::_rebuild_swap_chain(GLFWwindow* window)
vkDeviceWaitIdle(_device);
_release_swap_chain();
for (auto& iter : _allRenderTarget)
{
iter.Delete(_device);
}
#if DL_PLATFORM == DL_PLATFORM_ANDROID
// 安卓需要重建surface,其他平台待观察
_create_surface(window);
@@ -1784,6 +1792,12 @@ void VK::_rebuild_swap_chain(GLFWwindow* window)
_create_color_resources();
_create_depth_resources();
_create_frame_buffer();
for (size_t i = 0; i < _allRenderTarget.size(); ++i)
{
CreateRenderTargetReal(i, _allRenderTarget[i]);
UpdateCanvasRenderTarget(i, _allRenderTarget[i]);
}
}
@@ -3758,8 +3772,8 @@ void VK::_delete_2d()
vkDestroySampler(_device, _2d._textureSampler, nullptr);
for (auto& iter : _2d._allCanvas)
{
iter->Delete(_device);
delete iter;
iter.second->Delete(_device);
delete iter.second;
}
//索引缓冲
vkDestroyBuffer(_device, _2d._indexBuffer, nullptr);
@@ -5322,6 +5336,15 @@ void VK::ExportTexture(Texture tex, std::string_view path_name)
vkDestroyImage(_device, dst_image, nullptr);
}
void VK::ExportTextureCanvas(std::string_view path)
{
for (auto& iter : _2d._allCanvas)
{
std::string str = fmt::format("{}{}.png", path, iter.first);
ExportTexture(iter.second->_texture, str);
}
}
void VK::GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels)
{
//检查线性过滤 可用
@@ -5440,6 +5463,66 @@ void VK::_create_color_resources()
_colorImageView = CreateImageView(_colorImage, colorFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
}
bool VK::CreateRenderTargetReal(size_t i, VKRenderTarget& rt)
{
{
VkFormat colorFormat = _formatSwapChainImage;
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, _param._msaaLevel, colorFormat,
VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texColor._image, rt._texColor._memory);
rt._texColor._imageView = CreateImageView(rt._texColor._image, colorFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
}
{
VkFormat depthFormat = FindDepthFormat();
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, _param._msaaLevel,
depthFormat, VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texDepth._image, rt._texDepth._memory);
rt._texDepth._imageView = CreateImageView(rt._texDepth._image, depthFormat,
VK_IMAGE_ASPECT_DEPTH_BIT, 1);
TransitionImageLayout(rt._texDepth._image, depthFormat,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1);
}
{
VkFormat colorFormat = _formatSwapChainImage;
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, VK_SAMPLE_COUNT_1_BIT, colorFormat,
VK_IMAGE_TILING_OPTIMAL,
// translate标记不可写入到显存,sampled表示可以被后续作为shader资源
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | // 导出纹理使用
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texColorOut._image, rt._texColorOut._memory);
rt._texColorOut._imageView = CreateImageView(rt._texColorOut._image, colorFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
rt._texColorOut._width = _extentSwapChain.width;
rt._texColorOut._height = _extentSwapChain.height;
}
{
std::array<VkImageView, 3> attachments = {
rt._texColor._imageView,
rt._texDepth._imageView,
rt._texColorOut._imageView
};
VkFramebufferCreateInfo framebufferInfo{};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = _renderPass3D; // 渲染流程
framebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size());
framebufferInfo.pAttachments = attachments.data();
framebufferInfo.width = _extentSwapChain.width;
framebufferInfo.height = _extentSwapChain.height;
framebufferInfo.layers = 1;
if (vkCreateFramebuffer(_device, &framebufferInfo, nullptr, &rt._frameBuffer) != VK_SUCCESS)
{
log_damage0("创建帧缓冲区(RenderTarget)失败!");
return false;
}
}
return true;
}
VkSampleCountFlagBits VK::GetMaxUsableSampleCount()
{
VkPhysicalDeviceProperties physicalDeviceProperties;
@@ -5559,66 +5642,16 @@ void VK::SetSkybox(size_t i)
size_t VK::CreateRenderTarget()
{
size_t i = _allRenderTarget.size();
if (i >= CANVAS_ID_RENDER_TARGET_MAX)
{
log_err("RenderTarget数量超过上限:{}/{}", i, CANVAS_ID_RENDER_TARGET_MAX);
return -1;
}
VKRenderTarget rt;
{
VkFormat colorFormat = _formatSwapChainImage;
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, _param._msaaLevel, colorFormat,
VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texColor._image, rt._texColor._memory);
rt._texColor._imageView = CreateImageView(rt._texColor._image, colorFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
}
{
VkFormat depthFormat = FindDepthFormat();
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, _param._msaaLevel,
depthFormat, VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texDepth._image, rt._texDepth._memory);
rt._texDepth._imageView = CreateImageView(rt._texDepth._image, depthFormat,
VK_IMAGE_ASPECT_DEPTH_BIT, 1);
CreateRenderTargetReal(i, rt);
CreateCanvasRenderTarget(i, rt);
TransitionImageLayout(rt._texDepth._image, depthFormat,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
1);
}
{
VkFormat colorFormat = _formatSwapChainImage;
CreateImage(_extentSwapChain.width, _extentSwapChain.height, 1, VK_SAMPLE_COUNT_1_BIT, colorFormat,
VK_IMAGE_TILING_OPTIMAL,
// translate标记不可写入到显存,sampled表示可以被后续作为shader资源
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, rt._texColorOut._image, rt._texColorOut._memory);
rt._texColorOut._imageView = CreateImageView(rt._texColorOut._image, colorFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1);
// ai说法待验证 TransitionImageLayout 不需要,可在RenderPass处理
// -> shader可访问
/*TransitionImageLayout(rt._texColorOut._image, colorFormat,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
1);*/
}
{
std::array<VkImageView, 3> attachments = {
rt._texColor._imageView,
rt._texDepth._imageView,
rt._texColorOut._imageView
};
VkFramebufferCreateInfo framebufferInfo{};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = _renderPass3D; // 渲染流程
framebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size());
framebufferInfo.pAttachments = attachments.data();
framebufferInfo.width = _extentSwapChain.width;
framebufferInfo.height = _extentSwapChain.height;
framebufferInfo.layers = 1;
if (vkCreateFramebuffer(_device, &framebufferInfo, nullptr, &rt._frameBuffer) != VK_SUCCESS)
{
log_damage0("创建帧缓冲区(RenderTarget)失败!");
return -1;
}
}
_allRenderTarget.push_back(rt);
return i;
}
@@ -5729,21 +5762,27 @@ size_t VK::CreateTexture(std::string_view path_name, bool srgb)
return ret;
}
void VK::CreateCanvas(size_t id, const std::array<Image*, NUM_MIPMAP_2D>& vec_image)
void VK::CreateCanvas(int id, Texture tex)
{
assert(id == _2d._allCanvas.size());
auto iter = _2d._allCanvas.find(id);
if (iter != _2d._allCanvas.end())
{
log_damage("Canvas已存在:{}", id);
return;
}
Canvas* canvas = new Canvas(this);
canvas->_id = id;
canvas->_texture = CreateTexture2D(vec_image);
canvas->_texture = tex;
for (size_t i = 0; i < _countFrame; ++i)
{
canvas->_numVertex[i] = NUM_START_2D_VERTEX;
CreateVertexBufferCPU<Vertex2D>(canvas->_numVertex[i],
canvas->_vertexBuffer[i], canvas->_vertexBufferMemory[i], canvas->_vertexBufferSize[i]);
}
_2d._allCanvas.push_back(canvas);
_2d._allCanvas[id] = canvas;
//填充描述符
for (size_t i = 0; i < _countFrame; ++i)
@@ -5783,6 +5822,79 @@ void VK::CreateCanvas(size_t id, const std::array<Image*, NUM_MIPMAP_2D>& vec_im
}
}
void VK::CreateCanvasImage(size_t tex_id, const std::array<Image*, NUM_MIPMAP_2D>& vec_image)
{
CreateCanvas(CANVAS_ID_RENDER_TARGET_MAX + tex_id, CreateTexture2D(vec_image));
}
void VK::CreateCanvasRenderTarget(size_t rt_id, VKRenderTarget& rt)
{
CreateCanvas(rt_id, rt._texColorOut);
}
void VK::UpdateCanvasRenderTarget(size_t rt_id, VKRenderTarget& rt)
{
Canvas* canvas = GetCanvas(rt_id);
assert(canvas);
canvas->_texture = rt._texColorOut;
//填充描述符
size_t id = rt_id;
for (size_t i = 0; i < _countFrame; ++i)
{
size_t index = id * _countFrame + i;
// ubo
VkDescriptorBufferInfo bufferInfo{};
bufferInfo.buffer = _2d._uniformBuffers[i];
bufferInfo.offset = 0;
bufferInfo.range = sizeof(VK2D::UBO);
// 纹理
VkDescriptorImageInfo imageInfo{};
imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageInfo.imageView = canvas->_texture._imageView;
imageInfo.sampler = _2d._textureSampler;
std::array<VkWriteDescriptorSet, 2> descriptorWrites{};
descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrites[0].dstSet = _2d._descriptorSets[index];
descriptorWrites[0].dstBinding = 0;
descriptorWrites[0].dstArrayElement = 0;
descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
descriptorWrites[0].descriptorCount = 1;
descriptorWrites[0].pBufferInfo = &bufferInfo;
descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
descriptorWrites[1].dstSet = _2d._descriptorSets[index];
descriptorWrites[1].dstBinding = 1;
descriptorWrites[1].dstArrayElement = 0;
descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
descriptorWrites[1].descriptorCount = 1;
descriptorWrites[1].pImageInfo = &imageInfo;
vkUpdateDescriptorSets(_device,
(uint32_t)descriptorWrites.size(), descriptorWrites.data(),
0, nullptr);
}
}
VK::Canvas* VK::GetCanvas(int id)
{
auto iter = _2d._allCanvas.find(id);
if (iter == _2d._allCanvas.end())
return nullptr;
return iter->second;
}
dl::VK::Canvas* VK::GetCanvasByTexture(size_t tex_id)
{
return GetCanvas(CANVAS_ID_RENDER_TARGET_MAX + tex_id);
}
dl::VK::Canvas* VK::GetCanvasByRenderTarget(size_t rt_id)
{
return GetCanvas(rt_id);
}
Texture VK::CreateTexture2D(const std::array<Image*, NUM_MIPMAP_2D>& vec_image)
{
for(auto& iter : vec_image)
@@ -6132,13 +6244,14 @@ void VK::Update()
_2d._vecDc.clear();
_2d._vecDcTrans.clear();
//画布逻辑,更新顶点和cbo
//半透明需要排序,后面生成dc
// 画布逻辑,更新顶点和cbo
// 半透明需要排序,后面生成dc
//生成dc,并按z排序
// 生成dc,并按z排序
std::multimap<float, DrawCall> map_dc_translucent;
for (Canvas*& canvas : _2d._allCanvas)
for (auto& iter : _2d._allCanvas)
{
Canvas*& canvas = iter.second;
if (canvas->_allSprite.size() > NUM_MAX_2D_SPRITE)
{
log_warn("精灵数超过上限:{}", NUM_MAX_2D_SPRITE);
+18 -10
View File
@@ -337,7 +337,7 @@ public:
size_t _curPushConstant; // 当前使用 常量缓冲 下标
std::array<Coor*, NUM_MAX_ROOT_COOR> _allRootCoor; // 所有根坐标系
Matrix4 _mat2D; // 2d世界坐标系
std::vector<Canvas*> _allCanvas; // 所有画布
std::unordered_map<int, Canvas*> _allCanvas; // 画布(RenderTarget + 静态 + Register精灵)
RenderInfo2D _renderInfo; // 绘制信息
//------------------------缓存区域(避免每帧重分配内存)-----------------------
std::vector<VK::DrawCall> _vecDc;
@@ -438,7 +438,7 @@ public:
{
Texture _texColor;
Texture _texDepth;
Texture _texColorOut;
Texture _texColorOut; // 由Canvas释放
VkFramebuffer _frameBuffer;
void Delete(VkDevice device)
@@ -446,7 +446,7 @@ public:
vkDestroyFramebuffer(device, _frameBuffer, nullptr);
_texColor.Delete(device);
_texDepth.Delete(device);
_texColorOut.Delete(device);
//_texColorOut.Delete(device);
}
};
@@ -802,14 +802,15 @@ public:
//! 创建Canvas(2d管线资源)
void CreateCanvas(size_t id, const std::array<Image*, NUM_MIPMAP_2D>& vec_image);
void CreateCanvas(int id, Texture tex);
void CreateCanvasImage(size_t tex_id, const std::array<Image*, NUM_MIPMAP_2D>& vec_image);
void CreateCanvasRenderTarget(size_t rt_id, VKRenderTarget& rt);
Canvas* GetCanvas(size_t id)
{
if (id >= _2d._allCanvas.size())
return nullptr;
return _2d._allCanvas[id];
}
void UpdateCanvasRenderTarget(size_t rt_id, VKRenderTarget& rt);
Canvas* GetCanvas(int id);
Canvas* GetCanvasByTexture(size_t tex_id);
Canvas* GetCanvasByRenderTarget(size_t rt_id);
size_t GetCanvasSize()
{
@@ -830,6 +831,8 @@ public:
//!导出图像
void ExportTexture(Texture tex, std::string_view path_name);
void ExportTextureCanvas(std::string_view path);
//! 生成mipmap
void GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels);
@@ -841,6 +844,9 @@ public:
//! 设置当前天空盒
void SetSkybox(size_t i);
//
bool CreateRenderTargetReal(size_t i, VKRenderTarget& rt);
size_t CreateRenderTarget();
//! 返回绘制信息
@@ -1146,6 +1152,8 @@ private:
void _create_depth_resources();
// 创建msaa资源
void _create_color_resources();
//2d管线
void _create_2d();
void _delete_2d();