diff --git a/CMSceneGraph b/CMSceneGraph index e37055e3..28e59c27 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit e37055e34e72ab5723a350037ec216ca7ee12cfb +Subproject commit 28e59c2777ed5e0535ec0ba6b77577aa3a9b148f diff --git a/inc/hgl/graph/TextureLoader.h b/inc/hgl/graph/TextureLoader.h index 9b91adac..895ff4ec 100644 --- a/inc/hgl/graph/TextureLoader.h +++ b/inc/hgl/graph/TextureLoader.h @@ -207,7 +207,7 @@ namespace hgl { protected: // override functions - uint32 GetPixelsCount()const override{return file_header.length;} + uint32 GetPixelsCount()const override{return file_header.length*file_header.layers;} uint32 GetTotalBytes()const override { if(file_header.mipmaps<=1) @@ -230,7 +230,7 @@ namespace hgl { protected: // override functions - uint32 GetPixelsCount()const override{return file_header.width*file_header.height;} + uint32 GetPixelsCount()const override{return file_header.width*file_header.height*file_header.layers;} uint32 GetTotalBytes()const override { if(file_header.mipmaps<=1) diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 0a4f63c8..dfad2832 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -180,6 +180,9 @@ public: //Texture Texture2D *CreateTexture2D(TextureData *); Texture2D *CreateTexture2D(TextureCreateInfo *ci); + Texture2DArray *CreateTexture2DArray(TextureData *); + Texture2DArray *CreateTexture2DArray(TextureCreateInfo *ci); + TextureCube *CreateTextureCube(TextureData *); TextureCube *CreateTextureCube(TextureCreateInfo *ci); diff --git a/inc/hgl/graph/VKTexture.h b/inc/hgl/graph/VKTexture.h index d4216d08..7eec7f78 100644 --- a/inc/hgl/graph/VKTexture.h +++ b/inc/hgl/graph/VKTexture.h @@ -63,8 +63,8 @@ class Texture2D:public Texture { public: - Texture2D(VkDevice dev,TextureData *td):Texture(dev,td){} - ~Texture2D()=default; + using Texture::Texture; + virtual ~Texture2D()=default; static VkImageViewType GetImageViewType(){return VK_IMAGE_VIEW_TYPE_2D;} @@ -72,10 +72,19 @@ public: const uint32_t GetHeight()const{return data?data->image_view->GetExtent().height:0;} };//class Texture2D:public Texture -//class Texture2DArray:public Texture -//{ -// uint32_t width,height,count; -//};//class Texture2DArray:public Texture +class Texture2DArray:public Texture +{ +public: + + using Texture::Texture; + virtual ~Texture2DArray()=default; + + static VkImageViewType GetImageViewType(){return VK_IMAGE_VIEW_TYPE_2D_ARRAY;} + + const uint32_t GetWidth ()const{return data?data->image_view->GetExtent().width:0;} + const uint32_t GetHeight()const{return data?data->image_view->GetExtent().height:0;} + const uint32_t GetLayer ()const{return data?data->image_view->GetExtent().depth:0;} +};//class Texture2DArray:public Texture //class Texture3D:public Texture //{ diff --git a/inc/hgl/graph/VKTextureCreateInfo.h b/inc/hgl/graph/VKTextureCreateInfo.h index a1a3d5c4..d273aa64 100644 --- a/inc/hgl/graph/VKTextureCreateInfo.h +++ b/inc/hgl/graph/VKTextureCreateInfo.h @@ -20,13 +20,13 @@ struct TextureCreateInfo VkImageLayout image_layout; VkImage image; //如果没有IMAGE,则创建。(交换链等会直接提供image,所以存在外部传入现像) - DeviceMemory * memory; //同时需分配内存并绑定 + DeviceMemory * memory; //同时需分配内存并绑定 ImageView * image_view; //如果没有imageview,则创建 void * pixels; //如果没有buffer但有pixels,则根据pixels和以上条件创建buffer VkDeviceSize total_bytes; - DeviceBuffer * buffer; //如果pixels也没有,则代表不会立即写入图像数据 + DeviceBuffer * buffer; //如果pixels也没有,则代表不会立即写入图像数据 public: diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 1a02f98b..efa5a575 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -127,11 +127,13 @@ SET(VK_DEVICE_TEXTURE_SOURCE Vulkan/Texture/BufferImageCopy2D.h Vulkan/Texture/GenMipmaps.cpp Vulkan/Texture/VKDeviceTexture.cpp Vulkan/Texture/VKDeviceTexture2D.cpp + Vulkan/Texture/VKDeviceTexture2DArray.cpp Vulkan/Texture/VKDeviceTextureCube.cpp) SET(VK_TEXTURE_LOADER_SOURCE ${SG_INCLUDE_PATH}/VKTextureCreateInfo.h Vulkan/Texture/VKTextureLoader.h Vulkan/Texture/VKTexture2DLoader.cpp + Vulkan/Texture/VKTexture2DArrayLoader.cpp Vulkan/Texture/VKTextureCubeLoader.cpp) SET(VK_DEVICE_CREATER_SOURCE ${SG_INCLUDE_PATH}/VKDevice.h diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp index 6e8929cb..e635ba04 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture2D.cpp @@ -95,8 +95,6 @@ bool GPUDevice::CommitTexture2D(Texture2D *tex,DeviceBuffer *buf,VkPipelineStage BufferImageCopy buffer_image_copy(tex); - //CopyBufferToImageInfo info(tex,buf->GetBuffer(),&buffer_image_copy); - return CopyBufferToImage(tex,buf,&buffer_image_copy,destinationStage); } diff --git a/src/SceneGraph/Vulkan/Texture/VKTexture2DArrayLoader.cpp b/src/SceneGraph/Vulkan/Texture/VKTexture2DArrayLoader.cpp new file mode 100644 index 00000000..068d3871 --- /dev/null +++ b/src/SceneGraph/Vulkan/Texture/VKTexture2DArrayLoader.cpp @@ -0,0 +1,27 @@ +#include"VKTextureLoader.h" +#include +#include + +VK_NAMESPACE_BEGIN +template<> void VkTextureLoader::OnExtent(VkExtent3D &extent) +{ + extent.width =file_header.width; + extent.height =file_header.height; + extent.depth =file_header.layers; +} + +template<> Texture2DArray *VkTextureLoader::OnCreateTexture(TextureCreateInfo *tci) +{ + return device->CreateTexture2DArray(tci); +} + +Texture2DArray *CreateTexture2DArrayFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps) +{ + VkTextureLoader loader(device,auto_mipmaps); + + if(!loader.Load(filename)) + return(nullptr); + + return loader.GetTexture(); +} +VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 38af88ff..0fc528fe 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -118,6 +118,7 @@ Sampler *RenderResource::CreateSampler(Texture *tex) } Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps); +Texture2DArray *CreateTexture2DArrayFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps); Texture2D *RenderResource::LoadTexture2D(const OSString &filename,bool auto_mipmaps) {