update glsl

This commit is contained in:
ouczbs 2024-03-26 21:23:40 +08:00
parent c39c997c8d
commit c6e986bb69
17 changed files with 125 additions and 19 deletions

View File

@ -0,0 +1,20 @@
@echo off
setlocal EnableDelayedExpansion
set /p=<nul>exec.bat
set destPath=%2cpp/
ECHO @echo on >>exec.bat
for %%i in (*.vs.glsl) do (
set "s=%%i"
echo !s:vs.glsl=vert.spv!
set /p="glslc -fshader-stage=vertex %%i -o !s:vs.glsl=vert.spv!"<nul >> exec.bat
ECHO.>> exec.bat
)
for %%i in (*.ps.glsl) do (
set "s=%%i"
echo !s:ps.glsl=frag.spv!
set /p="glslc -fshader-stage=fragment %%i -o !s:ps.glsl=frag.spv!"<nul >> exec.bat
ECHO.>> exec.bat
)
ECHO @echo off>> exec.bat
call exec.bat
del exec.bat

Binary file not shown.

View File

@ -1,11 +1,8 @@
#version 450
layout(location = 0) in vec4 inColor;
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) out vec4 outFragColor;
layout(location = 0) out vec4 outColor;
void main()
{
outFragColor = inColor;
void main() {
outColor = vec4(1.0, 0.0, 0.0, 1.0);
}

Binary file not shown.

View File

@ -9,14 +9,19 @@ layout (location = 3) in vec3 tangent;
layout (location = 4) in vec4 weights;
layout (location = 5) in uvec4 bones;
// 在这里声明输出变量
layout(location = 0) out vec4 outColor;
// 顶点位置输出变量
//out vec4 outPosition;
out gl_PerVertex {
vec4 gl_Position;
};
void main()
{
gl_Position = vec4(position, 1);
outColor = vec4(texture, 0, 1);
vec2 positions[3] = vec2[](
vec2(0.0, -0.5),
vec2(0.5, 0.5),
vec2(-0.5, 0.5)
);
void main() {
gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
}

View File

@ -1,5 +1,6 @@
#pragma once
#include "asset_render.h"
#include "../wrapper/vertex.h"
namespace engineapi {
class Texture;
class Material;

View File

@ -0,0 +1,8 @@
#pragma once
#include "math/vector3.h"
namespace engineapi {
struct VertexBase{
virtual Vector3& GetPosition() = 0;
};
};

View File

@ -1,6 +1,7 @@
#include "backend.h"
#include "wrapper/queue.h"
#include "thread/worker.h"
#include "wrapper/descriptorpool.h"
#include <iostream>
#include "zlog.h"
namespace vulkanapi {
@ -28,6 +29,9 @@ namespace vulkanapi {
Backend::TransferWorker = GetWorker(Queue::TransferQueue);
Backend::RenderWorker = GetWorker(Queue::RenderQueue);
Backend::PresentWorker = GetWorker(Queue::PresentQueue);
auto poolSizes = DescriptorPool::DefaultDescriptorPoolSize();
mPool = new DescriptorPool(*mDevice, poolSizes, 1000);
}
Backend::~Backend()
{

View File

@ -5,10 +5,12 @@
#include "wrapper/device_creator.h"
namespace vulkanapi {
class CommandWorker;
class DescriptorPool;
class Backend{
protected:
Instance* mInstance;
Device* mDevice;
DescriptorPool* mPool;
map<const string*, CommandWorker*> mWorkerMap;
public:
Instance& GetInstance() {
@ -17,6 +19,9 @@ namespace vulkanapi {
Device& GetDevice() {
return *mDevice;
}
DescriptorPool& GetPool() {
return *mPool;
}
public:
Backend(const string appName);
~Backend();

View File

@ -176,6 +176,7 @@ namespace vulkanapi
{
string name; // For debug
VkPipeline pipeline = VK_NULL_HANDLE;
VkDescriptorSet descriptorSet = VK_NULL_HANDLE;
VkPipelineLayout pipelineLayout = VK_NULL_HANDLE;
VkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE;
VkDescriptorSetLayout sceneDescriptorSetLayout = VK_NULL_HANDLE; // For ray tracing

View File

@ -9,7 +9,9 @@
#include "pass/target.h"
#include "wrapper/swapchain.h"
#include "render/asset/mesh.h"
#include "wrapper/descriptorpool.h"
#include "window.h"
#include "zlog.h"
namespace vulkanapi {
RenderVulkanAPI::RenderVulkanAPI()
:backend("vulkan")
@ -135,8 +137,8 @@ namespace vulkanapi {
vkCmdBindVertexBuffers(ptr, 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(ptr, vulkanVAO->indexBuffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdBindPipeline(ptr, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->pipeline);
//vkCmdBindDescriptorSets(ptr, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->pipelineLayout, 0, 1, &pipeline->descriptorSet, 0, VK_NULL_HANDLE);
vkCmdDrawIndexed(ptr, vulkanVAO->indexCount, 1, 0, 0, 0);
vkCmdBindDescriptorSets(ptr, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->pipelineLayout, 0, 1, &pipeline->descriptorSet, 0, VK_NULL_HANDLE);
vkCmdDrawIndexed(ptr, 3, 1, 0, 0, 0);
context.Pass->EndPass(cmd);
});
Backend::RenderWorker->Flush();
@ -166,7 +168,8 @@ namespace vulkanapi {
bindingDescription.binding = 0;
bindingDescription.stride = sizeof(Vertex);
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
array<VkVertexInputAttributeDescription, 6> attributeDescriptions = {};
array<VkVertexInputAttributeDescription, 6> attributeDescriptions = { };
attributeDescriptions[0].binding = 0;
attributeDescriptions[0].location = 0;
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
@ -296,7 +299,7 @@ namespace vulkanapi {
pipelineInfo.pRasterizationState = &rasterizationInfo;
pipelineInfo.pMultisampleState = &multisampleInfo;
pipelineInfo.pColorBlendState = &colorBlending;
pipelineInfo.pDepthStencilState = &depthStencilInfo;
pipelineInfo.pDepthStencilState = nullptr; &depthStencilInfo;
pipelineInfo.layout = pipelineLayout;
pipelineInfo.renderPass = PassList[RENDER_FORWARD_RENDERING]->Ptr();
pipelineInfo.subpass = 0;
@ -316,6 +319,7 @@ namespace vulkanapi {
vulkan_pipeline->inUse = true;
vulkan_pipeline->pipelineLayout = pipelineLayout;
vulkan_pipeline->descriptorSetLayout = descriptorSetLayout;
vulkan_pipeline->descriptorSet = backend.GetPool().Allocate(descriptorSetLayout);
}
VulkanVAO* RenderVulkanAPI::GetNextVAO(uint32_t& index)
{

View File

@ -1,7 +1,6 @@
#pragma once
#include "../vulkan.h"
#include "zstd/pool.h"
#include "zlog.h"
#include "commandbuffer.h"
namespace vulkanapi {
class Device;

View File

@ -0,0 +1,30 @@
#include "descriptorpool.h"
#include "device.h"
namespace vulkanapi {
DescriptorPool::DescriptorPool(Device& device, vector<VkDescriptorPoolSize>& PoolSizes, uint32_t maxSets)
: mPtr(nullptr)
, mDevice(device)
{
VkDescriptorPoolCreateInfo descriptorPoolInfo{};
descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
descriptorPoolInfo.poolSizeCount = PoolSizes.size();
descriptorPoolInfo.pPoolSizes = PoolSizes.data();
descriptorPoolInfo.maxSets = maxSets;
vkCreateDescriptorPool(mDevice.Ptr(), &descriptorPoolInfo, nullptr, &mPtr);
}
VkDescriptorSet DescriptorPool::Allocate(VkDescriptorSetLayout& descriptorSetLayout)
{
VkDescriptorSet descriptorSet;
VkDescriptorSetAllocateInfo allocInfo{};
allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
allocInfo.descriptorPool = mPtr;
allocInfo.descriptorSetCount = 1;
allocInfo.pSetLayouts = &descriptorSetLayout;
vkAllocateDescriptorSets(mDevice.Ptr(), &allocInfo, &descriptorSet);
return descriptorSet;
}
}

View File

@ -0,0 +1,26 @@
#pragma once
#include "../vulkan.h"
#include "zstd/pool.h"
#include "commandbuffer.h"
namespace vulkanapi {
class Device;
class Queue;
class DescriptorPool {
protected:
VkDescriptorPool mPtr;
Device& mDevice;
public:
DescriptorPool(Device& device, vector<VkDescriptorPoolSize>& pPoolSizes,uint32_t maxSets);
VkDescriptorSet Allocate(VkDescriptorSetLayout& descriptorSetLayout);
public:
static vector<VkDescriptorPoolSize> DefaultDescriptorPoolSize() {
return vector<VkDescriptorPoolSize>{
{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 10000},
{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 10000},
{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 10000},
{VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 10000}
};
}
};
}

View File

@ -4,7 +4,7 @@ includes("xmake/**xmake.lua")
target("zengine")
set_kind("binary")
set_rundir(".")
add_rules("volk.env")
add_rules("volk.env", "glsl.env")
add_deps("zlib","zlog")
add_defines("VULKAN_API")
add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json")

View File

@ -0,0 +1,6 @@
rule("glsl.env")
-- before load
before_build(function (target)
os.cd("$(projectdir)/engine/assets/shader")
os.execv("gen_glsl.bat")
end )