render pass

This commit is contained in:
ouczbs 2024-03-22 21:08:02 +08:00
parent 9657ac63c3
commit 7423dd7656
39 changed files with 311 additions and 60 deletions

View File

@ -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;
}
};

View File

@ -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()
{

View File

@ -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;
}
}

View File

@ -47,6 +47,8 @@ namespace engineapi
}
AssetManager() = default;
public:
static string LoadTextFile(const string& path);
};
}
template<>

View File

@ -11,5 +11,8 @@ namespace engineapi {
StaticMesh(Model& model);
void LoadMesh();
Model& Ptr() {
return mPtr;
}
};
}

View File

@ -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)
{

View File

@ -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();

View File

@ -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);
}
}

View File

@ -4,6 +4,7 @@
namespace engineapi {
class Material : public Asset {
protected:
uint32_t mId;
public:
Material(string name, uint32_t flags);

View File

@ -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;

View File

@ -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()
{
}
}

View File

@ -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();
};
};

View File

@ -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);
}
}

View File

@ -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();
};
};

View File

@ -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
{

View File

@ -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);

View File

@ -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;

View 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(){};
};
}

View File

@ -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]);

View File

@ -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();
};

View File

@ -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()
{

View File

@ -26,5 +26,6 @@ namespace vulkanapi {
public:
static CommandWorker* TransferWorker;
static CommandWorker* RenderWorker;
};
};

View File

@ -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);
}
}

View File

@ -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);
};
}

View File

@ -0,0 +1,10 @@
#pragma once
#include "../vulkan.h"
namespace vulkanapi {
class Image;
class Device;
class RenderTarget {
public:
};
}

View File

@ -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);
}
}

View File

@ -24,5 +24,6 @@ namespace vulkanapi {
void ImmediatelyExecute(commandFn fn, voidFn callback) {
Buffer(mImmediateExeCmd, fn , callback);
}
void Draw(commandFn fn);
};
};

View File

@ -0,0 +1,9 @@
#include "vulkan_context.h"
#include "vulkanapi.h"
namespace engineapi {
void VulkanContext::UseContext()
{
Pass = API->VkPasses[PassId];
}
}

View 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;
};
}

View File

@ -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;
@ -35,28 +53,41 @@ namespace engineapi {
auto meshBuffer = GetNextVAO(mesh->VAO);
meshBuffer->indexCount = mesh->mIndices.size();
meshBuffer->vertexCount = mesh->mVertices.size();
// ----------------------------------------------- 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;
}
}

View File

@ -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:

View File

@ -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

View File

@ -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);
};

View File

@ -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);
}
}

View File

@ -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);
};
}

View File

@ -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 };
}
}

View File

@ -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);
};
};