render pass
This commit is contained in:
parent
9657ac63c3
commit
7423dd7656
4
engine/src/3rdparty/template/singleton.h
vendored
4
engine/src/3rdparty/template/singleton.h
vendored
@ -11,10 +11,10 @@ public:
|
||||
~Singleton() {
|
||||
ms_Singleton = nullptr;
|
||||
}
|
||||
static T& GetSingleton(void) {
|
||||
static constexpr T& GetSingleton(void) {
|
||||
return *ms_Singleton;
|
||||
}
|
||||
static T* GetSingletonPtr(void) {
|
||||
static constexpr T* GetSingletonPtr(void) {
|
||||
return ms_Singleton;
|
||||
}
|
||||
};
|
||||
@ -9,25 +9,12 @@ namespace engineapi {
|
||||
App::App(const string& path)
|
||||
{
|
||||
const char* name = "zengine";
|
||||
new AssetManager();
|
||||
_RenderAPI = RenderAPI::MakeInstance();
|
||||
_RenderAPI->SetUpRenderPasses();
|
||||
_Window = Window::MakeInstance(3, 640, 720, name);
|
||||
auto scene_manager = new SceneManager();
|
||||
scene_manager->LoadScene(path);
|
||||
new AssetManager();
|
||||
{
|
||||
ActorProperty property;
|
||||
property.id = 1;
|
||||
property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG;
|
||||
property.path = "assets/models/cube.obj";
|
||||
auto actor = ActorMesh::New(property);
|
||||
}
|
||||
{
|
||||
ActorProperty property;
|
||||
property.id = 1;
|
||||
property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG;
|
||||
property.path = "assets/models/box.ply";
|
||||
auto actor = ActorMesh::New(property);
|
||||
}
|
||||
}
|
||||
App::~App()
|
||||
{
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
#include "asset/asset_manager.h"
|
||||
#include "asset_manager.h"
|
||||
#include "zlog.h"
|
||||
using namespace std;
|
||||
namespace engineapi {
|
||||
void AssetManager::ClearAsset(Asset* asset)
|
||||
{
|
||||
@ -14,4 +16,25 @@ namespace engineapi {
|
||||
}
|
||||
}
|
||||
}
|
||||
string AssetManager::LoadTextFile(const string& path)
|
||||
{
|
||||
string text = "";
|
||||
ifstream file;
|
||||
file.exceptions(ifstream::failbit | ifstream::badbit);
|
||||
|
||||
try
|
||||
{
|
||||
file.open(path);
|
||||
stringstream stream;
|
||||
stream << file.rdbuf();
|
||||
file.close();
|
||||
text = stream.str();
|
||||
}
|
||||
catch (ifstream::failure e)
|
||||
{
|
||||
zlog::info("Failed to load text file: {}", path);
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,6 +47,8 @@ namespace engineapi
|
||||
}
|
||||
|
||||
AssetManager() = default;
|
||||
public:
|
||||
static string LoadTextFile(const string& path);
|
||||
};
|
||||
}
|
||||
template<>
|
||||
|
||||
@ -11,5 +11,8 @@ namespace engineapi {
|
||||
StaticMesh(Model& model);
|
||||
|
||||
void LoadMesh();
|
||||
Model& Ptr() {
|
||||
return mPtr;
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -1,10 +1,26 @@
|
||||
#include "scene.h"
|
||||
#include "object/camera/camera.h"
|
||||
#include "render/renderapi.h"
|
||||
#include "object/mesh/actor.h"
|
||||
#include "data/property/actor_property.h"
|
||||
namespace engineapi {
|
||||
Scene::Scene()
|
||||
{
|
||||
mCamera = new Camera();
|
||||
{
|
||||
ActorProperty property;
|
||||
property.id = 1;
|
||||
property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG;
|
||||
property.path = "assets/models/cube.obj";
|
||||
actor1 = ActorMesh::New(property);
|
||||
}
|
||||
{
|
||||
ActorProperty property;
|
||||
property.id = 1;
|
||||
property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG;
|
||||
property.path = "assets/models/box.ply";
|
||||
actor2 = ActorMesh::New(property);
|
||||
}
|
||||
}
|
||||
Scene::~Scene()
|
||||
{
|
||||
@ -15,6 +31,11 @@ namespace engineapi {
|
||||
void Scene::Render()
|
||||
{
|
||||
RenderAPI::GetSingletonPtr()->Render(*mCamera);
|
||||
auto meshs = actor1->Ptr().GetMeshs();
|
||||
for (auto it : meshs) {
|
||||
RenderAPI::GetSingletonPtr()->DrawStaticMesh(it);
|
||||
}
|
||||
//RenderAPI::GetSingletonPtr()->DrawStaticMesh(actor2);
|
||||
}
|
||||
void Scene::AddGameObject(GameObject* gameObject)
|
||||
{
|
||||
|
||||
@ -2,9 +2,12 @@
|
||||
#include "../game_object.h"
|
||||
namespace engineapi {
|
||||
class Camera;
|
||||
class ActorMesh;
|
||||
class Scene{
|
||||
protected:
|
||||
Camera* mCamera;
|
||||
ActorMesh* actor1;
|
||||
ActorMesh* actor2;
|
||||
public:
|
||||
Scene();
|
||||
~Scene();
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
#include "material.h"
|
||||
#include "../renderapi.h"
|
||||
namespace engineapi {
|
||||
Material::Material(string name, uint32_t flags)
|
||||
:Asset(name, flags)
|
||||
@ -10,6 +11,6 @@ namespace engineapi {
|
||||
}
|
||||
void Material::Use()
|
||||
{
|
||||
|
||||
RenderAPI::GetSingletonPtr()->UseMaterial(mId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
namespace engineapi {
|
||||
class Material : public Asset {
|
||||
protected:
|
||||
uint32_t mId;
|
||||
|
||||
public:
|
||||
Material(string name, uint32_t flags);
|
||||
|
||||
@ -9,7 +9,6 @@ namespace engineapi {
|
||||
uint32_t VAO = 0;
|
||||
vector<Vertex> mVertices;
|
||||
vector<uint32_t> mIndices;
|
||||
|
||||
public:
|
||||
Mesh(string name, uint32_t flags, vector<Vertex>& vertices, vector<uint32_t>& indices);
|
||||
void BeginLoad()override;
|
||||
|
||||
@ -96,8 +96,22 @@ namespace engineapi {
|
||||
|
||||
vertices.push_back(vertex);
|
||||
}
|
||||
// now wak through each of the mesh's faces (a face is a mesh its triangle) and retrieve the corresponding vertex indices.
|
||||
for (unsigned int i = 0; i < mesh->mNumFaces; i++)
|
||||
{
|
||||
const aiFace& face = mesh->mFaces[i];
|
||||
// retrieve all indices of the face and store them in the indices vector
|
||||
for (unsigned int j = 0; j < face.mNumIndices; j++)
|
||||
{
|
||||
indices.push_back(face.mIndices[j]);
|
||||
}
|
||||
}
|
||||
Mesh* model = new Mesh(mesh->mName.C_Str(), mFlags, vertices, indices);
|
||||
return model;
|
||||
}
|
||||
void Model::Use()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,5 +13,9 @@ namespace engineapi {
|
||||
void BeginLoad()override;
|
||||
void ProcessNode(const aiNode* pNode, const aiScene* pScene);
|
||||
Mesh* ProcessMesh(const aiMesh* mesh);
|
||||
vector<Mesh*>& GetMeshs() {
|
||||
return mMeshes;
|
||||
}
|
||||
void Use();
|
||||
};
|
||||
};
|
||||
@ -1,4 +1,5 @@
|
||||
#include "shader.h"
|
||||
#include "../renderapi.h"
|
||||
namespace engineapi {
|
||||
Shader::Shader(string name, uint32_t flags)
|
||||
:Asset(name, flags)
|
||||
@ -12,4 +13,8 @@ namespace engineapi {
|
||||
{
|
||||
|
||||
}
|
||||
void Shader::Use()
|
||||
{
|
||||
RenderAPI::GetSingletonPtr()->UseShader(mId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,10 +4,11 @@
|
||||
namespace engineapi {
|
||||
class Shader : public Asset {
|
||||
protected:
|
||||
|
||||
uint32_t mId;
|
||||
public:
|
||||
Shader(string name, uint32_t flags);
|
||||
~Shader();
|
||||
void BeginLoad()override;
|
||||
void Use();
|
||||
};
|
||||
};
|
||||
@ -15,11 +15,17 @@ namespace engineapi {
|
||||
class Camera;
|
||||
class RenderPass
|
||||
{
|
||||
protected:
|
||||
RenderPassType mType;
|
||||
public:
|
||||
RenderPass() {};
|
||||
RenderPass(RenderPassType type) : mType(type){};
|
||||
~RenderPass() {};
|
||||
|
||||
virtual void Render(Camera& camera) = 0;
|
||||
public:
|
||||
RenderPassType GetType() {
|
||||
return mType;
|
||||
}
|
||||
};
|
||||
class RenderStateSetting
|
||||
{
|
||||
|
||||
@ -2,10 +2,13 @@
|
||||
#include "../renderapi.h"
|
||||
#include "../window.h"
|
||||
#include "object/camera/camera.h"
|
||||
#include "../asset/model.h"
|
||||
#include "asset/asset_manager.h"
|
||||
namespace engineapi {
|
||||
RenderPassForwardRendering::RenderPassForwardRendering()
|
||||
{
|
||||
skyBox = nullptr;
|
||||
mID = 0;
|
||||
mSky = AssetManager::GetSingletonPtr()->LoadAsset<Model>("assets/models/SkyBoxMesh.ply", Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG);
|
||||
//skyBoxMaterial = new Material(new Shader(Resources::GetAssetFullPath("Shaders/SkyBox.zxshader", true), FrameBufferType::Normal));
|
||||
|
||||
|
||||
@ -41,6 +44,7 @@ namespace engineapi {
|
||||
Matrix4 mat_V = Matrix4(Matrix3(camera.GetViewMatrix()));
|
||||
Matrix4 mat_P = camera.GetProjectionMatrix();
|
||||
|
||||
mSky->Use();
|
||||
//skyBoxMaterial->Use();
|
||||
//skyBoxMaterial->SetMatrix("ENGINE_View", mat_V);
|
||||
//skyBoxMaterial->SetMatrix("ENGINE_Projection", mat_P);
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
#include "object/render/mesh_render.h"
|
||||
namespace engineapi {
|
||||
class Camera;
|
||||
class Model;
|
||||
class RenderPassForwardRendering : public RenderPass
|
||||
{
|
||||
public:
|
||||
@ -12,9 +13,8 @@ namespace engineapi {
|
||||
virtual void Render(Camera& camera);
|
||||
|
||||
private:
|
||||
uint32_t drawCommandID = 0;
|
||||
Mesh* skyBox;
|
||||
Material* skyBoxMaterial;
|
||||
uint32_t mID;
|
||||
Model* mSky;
|
||||
RenderStateSetting* skyBoxRenderState;
|
||||
RenderStateSetting* opaqueRenderState;
|
||||
RenderStateSetting* transparentRenderState;
|
||||
|
||||
0
engine/src/engine/render/render_context.cpp
Normal file
0
engine/src/engine/render/render_context.cpp
Normal file
12
engine/src/engine/render/render_context.h
Normal file
12
engine/src/engine/render/render_context.h
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
#pragma once
|
||||
#include "asset/asset_render.h"
|
||||
namespace engineapi
|
||||
{
|
||||
struct RenderContext {
|
||||
uint32_t MaterialId;
|
||||
uint32_t PassId;
|
||||
uint32_t ShaderId;
|
||||
virtual void UseContext(){};
|
||||
};
|
||||
}
|
||||
@ -6,6 +6,10 @@
|
||||
#endif // VULKAN_API
|
||||
namespace engineapi {
|
||||
RenderAPI::RenderAPI()
|
||||
{
|
||||
|
||||
}
|
||||
void RenderAPI::SetUpRenderPasses()
|
||||
{
|
||||
mAllPasses.resize(ZX_RENDER_PASS_COUNT);
|
||||
|
||||
@ -15,10 +19,6 @@ namespace engineapi {
|
||||
//mAllPasses[ZX_RENDER_PASS_AFTER_EFFECT_RENDERING] = new RenderPassAfterEffectRendering();
|
||||
//mAllPasses[ZX_RENDER_PASS_UI_RENDERING] = new RenderPassUIRendering();
|
||||
|
||||
SetUpRenderPasses();
|
||||
}
|
||||
void RenderAPI::SetUpRenderPasses()
|
||||
{
|
||||
mCurPasses.clear();
|
||||
//mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_SHADOW_GENERATION]);
|
||||
mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_FORWARD_RENDERING]);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "asset/asset_render.h"
|
||||
#include "render_context.h"
|
||||
#include "singleton.h"
|
||||
namespace engineapi
|
||||
{
|
||||
@ -11,19 +11,34 @@ namespace engineapi
|
||||
protected:
|
||||
ViewPortInfo mViewPortInfo;
|
||||
|
||||
RenderContext* mContext;
|
||||
vector<RenderPass*> mCurPasses;
|
||||
vector<RenderPass*> mAllPasses;
|
||||
public:
|
||||
RenderAPI();
|
||||
virtual ~RenderAPI() {};
|
||||
public:
|
||||
virtual void SetUpRenderPasses();
|
||||
virtual void InitRenderPass() = 0;
|
||||
public:
|
||||
virtual void SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset = 0, uint32_t yOffset = 0) = 0;
|
||||
|
||||
virtual void BeginFrame() = 0;
|
||||
virtual void Render(Camera& camera);
|
||||
virtual void EndFrame() = 0;
|
||||
virtual void SetStaticMesh(Mesh* mesh) = 0;
|
||||
virtual void DrawStaticMesh(Mesh* mesh) = 0;
|
||||
|
||||
virtual void SwitchContext() = 0;
|
||||
|
||||
virtual void UseMaterial(uint32_t ID) {
|
||||
mContext->MaterialId = ID;
|
||||
};
|
||||
virtual void UseShader(uint32_t ID) {
|
||||
mContext->PassId = ID;
|
||||
};
|
||||
virtual void UsePass(uint32_t ID) {
|
||||
mContext->ShaderId = ID;
|
||||
};
|
||||
public:
|
||||
static RenderAPI* MakeInstance();
|
||||
};
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include "zlog.h"
|
||||
namespace vulkanapi {
|
||||
CommandWorker* Backend::TransferWorker = nullptr;
|
||||
CommandWorker* Backend::RenderWorker = nullptr;
|
||||
Backend::Backend(const string appName)
|
||||
{
|
||||
auto instanceCreator = InstanceCreator();
|
||||
@ -24,6 +25,7 @@ namespace vulkanapi {
|
||||
InitWorker(Queue::PresentQueue, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
|
||||
|
||||
Backend::TransferWorker = GetWorker(Queue::TransferQueue);
|
||||
Backend::RenderWorker = GetWorker(Queue::RenderQueue);
|
||||
}
|
||||
Backend::~Backend()
|
||||
{
|
||||
|
||||
@ -26,5 +26,6 @@ namespace vulkanapi {
|
||||
|
||||
public:
|
||||
static CommandWorker* TransferWorker;
|
||||
static CommandWorker* RenderWorker;
|
||||
};
|
||||
};
|
||||
@ -2,7 +2,11 @@
|
||||
#include "../wrapper/renderpass.h"
|
||||
#include "../wrapper/image.h"
|
||||
namespace vulkanapi {
|
||||
ForwardPass::ForwardPass(Device& device, GeometryBuffer& gBuffer)
|
||||
void ForwardPass::Record()
|
||||
{
|
||||
|
||||
}
|
||||
ForwardPass* ForwardPass::MakePass(Device& device, GeometryBuffer& gBuffer)
|
||||
{
|
||||
VkAttachmentDescription positionAttachment{};
|
||||
positionAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||
@ -33,13 +37,9 @@ namespace vulkanapi {
|
||||
subpass.colorAttachmentCount = 1;
|
||||
subpass.pColorAttachments = &colorAttachmentRef;
|
||||
|
||||
vector<VkAttachmentDescription> attachments = {positionAttachment , normalAttachment};
|
||||
vector<VkAttachmentDescription> attachments = { positionAttachment , normalAttachment };
|
||||
vector<VkSubpassDescription> subpasses = { subpass };
|
||||
vector<VkSubpassDependency> dependencies;
|
||||
mPass = new RenderPass(device,"forward",attachments, subpasses, dependencies);
|
||||
}
|
||||
void ForwardPass::Record()
|
||||
{
|
||||
|
||||
return new ForwardPass(device, "forward", attachments, subpasses, dependencies);
|
||||
}
|
||||
}
|
||||
@ -1,15 +1,14 @@
|
||||
#pragma once
|
||||
#include "../wrapper/renderpass.h"
|
||||
#include "gbuffer.h"
|
||||
namespace vulkanapi {
|
||||
class RenderPass;
|
||||
//class MaterialCache;
|
||||
class ForwardPass {
|
||||
protected:
|
||||
RenderPass* mPass;
|
||||
class ForwardPass : public RenderPass {
|
||||
//MaterialCache mMaterials;
|
||||
public:
|
||||
ForwardPass(Device& device, GeometryBuffer& gBuffer);
|
||||
|
||||
using RenderPass::RenderPass;
|
||||
void Record();
|
||||
public:
|
||||
static ForwardPass* MakePass(Device& device, GeometryBuffer& gBuffer);
|
||||
};
|
||||
}
|
||||
0
engine/src/engine/vulkanapi/pass/target.cpp
Normal file
0
engine/src/engine/vulkanapi/pass/target.cpp
Normal file
10
engine/src/engine/vulkanapi/pass/target.h
Normal file
10
engine/src/engine/vulkanapi/pass/target.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include "../vulkan.h"
|
||||
namespace vulkanapi {
|
||||
class Image;
|
||||
class Device;
|
||||
class RenderTarget {
|
||||
public:
|
||||
|
||||
};
|
||||
}
|
||||
@ -41,4 +41,15 @@ namespace vulkanapi {
|
||||
{
|
||||
mWork.SyncInvoke([]() {});
|
||||
}
|
||||
void CommandWorker::Draw(commandFn fn)
|
||||
{
|
||||
CommandBuffer cmd = mCommandPool.Pop();
|
||||
cmd.Reset();
|
||||
cmd.BeginRecord(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
||||
fn(cmd);
|
||||
cmd.EndRecord();
|
||||
cmd.Submit(mQueue.Ptr());
|
||||
cmd.WaitFofFence(mDevice.Ptr());
|
||||
mCommandPool.Push(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,5 +24,6 @@ namespace vulkanapi {
|
||||
void ImmediatelyExecute(commandFn fn, voidFn callback) {
|
||||
Buffer(mImmediateExeCmd, fn , callback);
|
||||
}
|
||||
void Draw(commandFn fn);
|
||||
};
|
||||
};
|
||||
9
engine/src/engine/vulkanapi/vulkan_context.cpp
Normal file
9
engine/src/engine/vulkanapi/vulkan_context.cpp
Normal file
@ -0,0 +1,9 @@
|
||||
#include "vulkan_context.h"
|
||||
#include "vulkanapi.h"
|
||||
namespace engineapi {
|
||||
void VulkanContext::UseContext()
|
||||
{
|
||||
Pass = API->VkPasses[PassId];
|
||||
|
||||
}
|
||||
}
|
||||
11
engine/src/engine/vulkanapi/vulkan_context.h
Normal file
11
engine/src/engine/vulkanapi/vulkan_context.h
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#include "render/render_context.h"
|
||||
#include "vulkanapi.h"
|
||||
namespace engineapi {
|
||||
struct VulkanContext : public RenderContext {
|
||||
RenderVulkanAPI* API;
|
||||
vulkanapi::RenderPass* Pass;
|
||||
|
||||
virtual void UseContext()override;
|
||||
};
|
||||
}
|
||||
@ -5,16 +5,34 @@
|
||||
#include "thread/worker.h"
|
||||
#include "render/asset/mesh.h"
|
||||
#include "object/camera/camera.h"
|
||||
#include "render/pass/renderpass.h"
|
||||
#include "pass/forwardpass.h"
|
||||
namespace engineapi {
|
||||
RenderVulkanAPI::RenderVulkanAPI()
|
||||
:backend("vulkan")
|
||||
{
|
||||
mContext = &context;
|
||||
Buffer::MakeVmaAllocator(backend);
|
||||
}
|
||||
RenderVulkanAPI::~RenderVulkanAPI()
|
||||
{
|
||||
zlog::info("~RenderVulkanAPI");
|
||||
}
|
||||
void RenderVulkanAPI::SwitchContext()
|
||||
{
|
||||
|
||||
}
|
||||
void RenderVulkanAPI::InitRenderPass()
|
||||
{
|
||||
VkPasses.resize(RenderPassType::ZX_RENDER_PASS_COUNT);
|
||||
auto gbuffer = GeometryBuffer(backend.GetDevice(), 3, 640, 720);
|
||||
for (auto pass : mAllPasses) {
|
||||
auto type = pass->GetType();
|
||||
if (type == RenderPassType::ZX_RENDER_PASS_FORWARD_RENDERING) {
|
||||
VkPasses[type] = ForwardPass::MakePass(backend.GetDevice(), gbuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
void RenderVulkanAPI::SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset)
|
||||
{
|
||||
mViewPortInfo.width = width;
|
||||
@ -38,25 +56,38 @@ namespace engineapi {
|
||||
|
||||
// ----------------------------------------------- Vertex Buffer -----------------------------------------------
|
||||
VkDeviceSize vertexBufferSize = sizeof(Vertex) * mesh->mVertices.size();
|
||||
VmaAllocationCreateInfo vertexStagingAllocInfo = {};
|
||||
VkBufferCreateInfo vertexStagingBufferInfo = Buffer::MakeStageInfo(vertexStagingAllocInfo, vertexBufferSize);
|
||||
|
||||
VmaAllocation vertexStagingBufferAlloc;
|
||||
VkBuffer vertexStagingBuffer = Buffer::CreateBuffer(vertexStagingBufferInfo, vertexStagingAllocInfo, vertexStagingBufferAlloc);
|
||||
VmaAllocationCreateInfo vertexVmaStagingInfo = {};
|
||||
VmaAllocation vertexVmaStagingAlloc;
|
||||
VkBuffer vertexStagingBuffer = Buffer::CreateStageBuffer(vertexVmaStagingInfo, vertexVmaStagingAlloc, vertexBufferSize);
|
||||
|
||||
// 拷贝数据到StagingBuffer
|
||||
Buffer::CopyData(vertexStagingBufferAlloc, mesh->mVertices.data(), vertexBufferSize);
|
||||
Buffer::CopyData(vertexVmaStagingAlloc, mesh->mVertices.data(), vertexBufferSize);
|
||||
|
||||
VkBufferUsageFlags vertexFlags = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;//加入光线追踪
|
||||
VmaAllocationCreateInfo vertexVmaCreateInfo = {};
|
||||
VkBufferCreateInfo vertexCreateInfo = Buffer::MakeDeviceInfo(vertexVmaCreateInfo, vertexBufferSize, vertexFlags);
|
||||
meshBuffer->vertexBuffer = Buffer::CreateBuffer(vertexCreateInfo, vertexVmaCreateInfo, meshBuffer->vertexBufferAlloc);
|
||||
|
||||
// ----------------------------------------------- Index Buffer -----------------------------------------------
|
||||
VkDeviceSize indexBufferSize = sizeof(uint32_t) * mesh->mIndices.size();
|
||||
VmaAllocationCreateInfo indexVmaStagingInfo = {};
|
||||
VmaAllocation indexVmaStagingAlloc;
|
||||
VkBuffer indexStagingBuffer = Buffer::CreateStageBuffer(indexVmaStagingInfo, indexVmaStagingAlloc, vertexBufferSize);
|
||||
// 拷贝数据到StagingBuffer
|
||||
Buffer::CopyData(indexVmaStagingAlloc, mesh->mIndices.data(), indexBufferSize);
|
||||
|
||||
VmaAllocationCreateInfo indexVmaCreateInfo = {};
|
||||
VkBufferCreateInfo indexCreateInfo = Buffer::MakeDeviceInfo(indexVmaCreateInfo, indexBufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
||||
meshBuffer->indexBuffer = Buffer::CreateBuffer(indexCreateInfo, indexVmaCreateInfo, meshBuffer->vertexBufferAlloc);
|
||||
|
||||
VkBufferUsageFlags flags = 0;//加入光线追踪
|
||||
VmaAllocationCreateInfo vertexBufferAllocInfo = {};
|
||||
VkBufferCreateInfo vertexBufferInfo = Buffer::MakeDeviceInfo(vertexBufferAllocInfo, vertexBufferSize, flags);
|
||||
meshBuffer->vertexBuffer = Buffer::CreateBuffer(vertexBufferInfo, vertexBufferAllocInfo, meshBuffer->vertexBufferAlloc);
|
||||
auto fn = [=](CommandBuffer& cmd) {
|
||||
cmd.CmdCopyBuffer(vertexStagingBuffer, meshBuffer->vertexBuffer, vertexBufferSize);
|
||||
cmd.CmdCopyBuffer(indexStagingBuffer, meshBuffer->indexBuffer, indexBufferSize);
|
||||
};
|
||||
auto callback = [=]() {
|
||||
// 销毁StagingBuffer
|
||||
Buffer::DestroyBuffer(vertexStagingBuffer, vertexStagingBufferAlloc);
|
||||
Buffer::DestroyBuffer(vertexStagingBuffer, vertexVmaStagingAlloc);
|
||||
Buffer::DestroyBuffer(indexStagingBuffer, indexVmaStagingAlloc);
|
||||
mesh->EndLoad();
|
||||
};
|
||||
if (mesh->IsAsync()) {
|
||||
@ -66,6 +97,24 @@ namespace engineapi {
|
||||
Backend::TransferWorker->ImmediatelyExecute(fn, callback);
|
||||
}
|
||||
}
|
||||
void RenderVulkanAPI::DrawStaticMesh(Mesh* mesh)
|
||||
{
|
||||
|
||||
}
|
||||
void RenderVulkanAPI::DrawStaticMesh(Mesh* mesh)
|
||||
{
|
||||
auto vulkanVAO = VAOList[mesh->VAO];
|
||||
Backend::RenderWorker->Draw([=](CommandBuffer& cmd) {
|
||||
VkCommandBuffer ptr = cmd.Ptr();
|
||||
context.Pass->BeginPass(cmd);
|
||||
VkBuffer vertexBuffers[] = { vulkanVAO->vertexBuffer };
|
||||
VkDeviceSize offsets[] = { 0 };
|
||||
vkCmdBindVertexBuffers(ptr, 0, 1, vertexBuffers, offsets);
|
||||
vkCmdBindIndexBuffer(ptr, vulkanVAO->indexBuffer, 0, VK_INDEX_TYPE_UINT32);
|
||||
vkCmdDrawIndexed(ptr, vulkanVAO->indexCount, 1, 0, 0, 0);
|
||||
context.Pass->EndPass(cmd);
|
||||
});
|
||||
}
|
||||
VulkanVAO* RenderVulkanAPI::GetNextVAO(uint32_t& VAO_index)
|
||||
{
|
||||
uint32_t length = (uint32_t)VAOList.size();
|
||||
@ -81,5 +130,6 @@ namespace engineapi {
|
||||
VAOList.push_back(vao);
|
||||
return vao;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
#pragma once
|
||||
#include "backend.h"
|
||||
#include "wrapper/renderpass.h"
|
||||
#include "render/renderapi.h"
|
||||
#include "vulkan_context.h"
|
||||
#include "vulkan_struct.h"
|
||||
using namespace vulkanapi;
|
||||
namespace engineapi
|
||||
@ -9,15 +11,23 @@ namespace engineapi
|
||||
{
|
||||
public:
|
||||
Backend backend;
|
||||
VulkanContext context;
|
||||
vector<VulkanVAO*> VAOList;
|
||||
vector<vulkanapi::RenderPass*> VkPasses;
|
||||
public:
|
||||
RenderVulkanAPI();
|
||||
virtual ~RenderVulkanAPI()override;
|
||||
public:
|
||||
virtual void SwitchContext()override;
|
||||
public:
|
||||
virtual void InitRenderPass()override;
|
||||
public:
|
||||
virtual void SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset = 0, uint32_t yOffset = 0)override;
|
||||
|
||||
virtual void BeginFrame()override;
|
||||
virtual void EndFrame()override;
|
||||
virtual void SetStaticMesh(Mesh* mesh)override;
|
||||
virtual void DrawStaticMesh(Mesh* mesh)override;
|
||||
public:
|
||||
VulkanVAO* GetNextVAO(uint32_t& VAO_index);
|
||||
public:
|
||||
|
||||
@ -51,6 +51,11 @@ namespace vulkanapi {
|
||||
vmaCreateBuffer(vmaAllocator, &bufferCreateInfo, &allocationCreateInfo, &buffer, &allocation, nullptr);
|
||||
return buffer;
|
||||
}
|
||||
VkBuffer Buffer::CreateStageBuffer(VmaAllocationCreateInfo& allocationCreateInfo, VmaAllocation& allocation, VkDeviceSize bufferSize)
|
||||
{
|
||||
VkBufferCreateInfo bufferCreateInfo = MakeStageInfo(allocationCreateInfo, bufferSize);
|
||||
return CreateBuffer(bufferCreateInfo, allocationCreateInfo, allocation);
|
||||
}
|
||||
void Buffer::CopyData(VmaAllocation& allocation, void* data, VkDeviceSize size)
|
||||
{
|
||||
// 拷贝数据到StagingBuffer
|
||||
|
||||
@ -13,6 +13,7 @@ namespace vulkanapi {
|
||||
static VkBuffer CreateBuffer(VkBufferCreateInfo& bufferCreateInfo,
|
||||
VmaAllocationCreateInfo& allocationCreateInfo,
|
||||
VmaAllocation& allocation);
|
||||
static VkBuffer CreateStageBuffer(VmaAllocationCreateInfo& allocationCreateInfo, VmaAllocation& allocation, VkDeviceSize vertexBufferSize);
|
||||
static void CopyData(VmaAllocation& allocation,void* data, VkDeviceSize size);
|
||||
static void DestroyBuffer(VkBuffer buffer, VmaAllocation bufferAlloc);
|
||||
};
|
||||
|
||||
@ -11,7 +11,7 @@ namespace vulkanapi {
|
||||
}
|
||||
CommandBuffer::~CommandBuffer()
|
||||
{
|
||||
zlog::info("CommandBuffer Destruct {:#x} isNull = {}", (uint64_t)this, mPtr == nullptr || mFence == nullptr);
|
||||
//zlog::info("CommandBuffer Destruct {:#x} isNull = {}", (uint64_t)this, mPtr == nullptr || mFence == nullptr);
|
||||
if (mPtr) {
|
||||
mPool.FreeBuffer(mPtr);
|
||||
}
|
||||
@ -26,7 +26,7 @@ namespace vulkanapi {
|
||||
{
|
||||
other.mPtr = nullptr;
|
||||
other.mFence = nullptr;
|
||||
zlog::info("CommandBuffer MoveConstruct {:#x} => {:#x}", (uint64_t)&other, (uint64_t)this);
|
||||
//zlog::info("CommandBuffer MoveConstruct {:#x} => {:#x}", (uint64_t)&other, (uint64_t)this);
|
||||
}
|
||||
void CommandBuffer::Reset()
|
||||
{
|
||||
@ -66,5 +66,14 @@ namespace vulkanapi {
|
||||
{
|
||||
vkWaitForFences(device, 1, &mFence, VK_TRUE, UINT64_MAX);
|
||||
}
|
||||
void CommandBuffer::BindVertexBuffer(VkBuffer buffer, uint32_t offset)
|
||||
{
|
||||
VkDeviceSize offsets[] = { offset };
|
||||
vkCmdBindVertexBuffers(mPtr, 0, 1, &buffer, offsets);
|
||||
}
|
||||
void CommandBuffer::BindIndexBuffers(VkBuffer buffer, uint32_t offset, VkIndexType type)
|
||||
{
|
||||
vkCmdBindIndexBuffer(mPtr, buffer, offset, type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,5 +25,8 @@ namespace vulkanapi {
|
||||
void CmdCopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
|
||||
void Submit(VkQueue& queue);
|
||||
void WaitFofFence(VkDevice& device);
|
||||
|
||||
void BindVertexBuffer(VkBuffer buffer, uint32_t offset);
|
||||
void BindIndexBuffers(VkBuffer buffer, uint32_t offset, VkIndexType type);
|
||||
};
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
#include "renderpass.h"
|
||||
#include "device.h"
|
||||
#include "commandbuffer.h"
|
||||
namespace vulkanapi {
|
||||
RenderPass::RenderPass(Device& device, const char* name,
|
||||
vector<VkAttachmentDescription>& attachments,
|
||||
@ -19,5 +20,23 @@ namespace vulkanapi {
|
||||
dependencies.data()
|
||||
};
|
||||
vkCreateRenderPass(device.Ptr(), &create_info, nullptr, &mPtr);
|
||||
|
||||
mPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||
mPassBeginInfo.renderPass = mPtr;
|
||||
}
|
||||
void RenderPass::BeginPass(CommandBuffer& cmd)
|
||||
{
|
||||
vkCmdBeginRenderPass(cmd.Ptr(), &mPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||
}
|
||||
void RenderPass::EndPass(CommandBuffer& cmd)
|
||||
{
|
||||
vkCmdEndRenderPass(cmd.Ptr());
|
||||
}
|
||||
void RenderPass::SetViewPort(uint32_t width, uint32_t height, int32_t xoffset, int32_t yoffset)
|
||||
{
|
||||
// 这个render area定义了shader将要加载和存储的位置
|
||||
mPassBeginInfo.renderArea.offset = { xoffset, yoffset };
|
||||
// 一般来说大小(extend)是和framebuffer的attachment一致的,如果小了会浪费,大了超出去的部分是一些未定义数值
|
||||
mPassBeginInfo.renderArea.extent = { width, height };
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,14 +4,23 @@
|
||||
|
||||
namespace vulkanapi {
|
||||
class Device;
|
||||
class CommandBuffer;
|
||||
class RenderPass {
|
||||
protected:
|
||||
VkRenderPass mPtr;
|
||||
VkRenderPassBeginInfo mPassBeginInfo{};
|
||||
|
||||
public:
|
||||
RenderPass(Device& device, const char* name,
|
||||
vector<VkAttachmentDescription>& attachments,
|
||||
vector<VkSubpassDescription>& subpasses,
|
||||
vector<VkSubpassDependency>& dependencies);
|
||||
//colorAttachments, depthAttachment, subpasses, dependencies);
|
||||
|
||||
public:
|
||||
void BeginPass(CommandBuffer& cmd);
|
||||
void EndPass(CommandBuffer& cmd);
|
||||
|
||||
public:
|
||||
void SetViewPort(uint32_t width, uint32_t height, int32_t xoffset, int32_t yoffset);
|
||||
};
|
||||
};
|
||||
Loading…
Reference in New Issue
Block a user