mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-23 12:37:45 +00:00
Implement some stuff required for skin shaders
Punching some holes to allow shaders to access textures
This commit is contained in:
parent
af806bff63
commit
74f754b382
4 changed files with 67 additions and 17 deletions
2
extern/libphysis
vendored
2
extern/libphysis
vendored
|
@ -1 +1 @@
|
|||
Subproject commit 5241b087e4514cabd4dc825a8ec56ff33d4350ea
|
||||
Subproject commit 5b023199fa04fbaf550c78e5d06f302a307132a7
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "baserenderer.h"
|
||||
#include "buffer.h"
|
||||
#include "drawobject.h"
|
||||
#include "shaderstructs.h"
|
||||
#include "texture.h"
|
||||
|
||||
|
@ -72,8 +73,8 @@ private:
|
|||
Device &m_device;
|
||||
GameData *m_data = nullptr;
|
||||
|
||||
VkDescriptorSet createDescriptorFor(const DrawObject *object, const CachedPipeline &cachedPipeline, int i);
|
||||
void bindDescriptorSets(VkCommandBuffer commandBuffer, CachedPipeline &pipeline, const DrawObject *object);
|
||||
VkDescriptorSet createDescriptorFor(const DrawObject *object, const CachedPipeline &cachedPipeline, int i, const RenderMaterial *material);
|
||||
void bindDescriptorSets(VkCommandBuffer commandBuffer, CachedPipeline &pipeline, const DrawObject *object, const RenderMaterial *material);
|
||||
|
||||
Buffer g_CameraParameter;
|
||||
Buffer g_InstanceParameter;
|
||||
|
@ -81,6 +82,8 @@ private:
|
|||
Buffer g_MaterialParameter;
|
||||
Buffer g_CommonParameter;
|
||||
Buffer g_LightParam;
|
||||
Buffer g_SceneParameter;
|
||||
Buffer g_CustomizeParameter;
|
||||
|
||||
Buffer m_planeVertexBuffer;
|
||||
|
||||
|
|
|
@ -44,9 +44,8 @@ struct ModelParameter {
|
|||
ModelParameterStruct g_ModelParameter;
|
||||
};
|
||||
|
||||
struct MaterialParameter {
|
||||
glm::vec3 g_DiffuseColor; // TODO: align to vec4
|
||||
float g_AlphaThreshold;
|
||||
struct MaterialParameters {
|
||||
glm::vec4 parameters[6] = {}; // TODO: this is actually different depending on the shpk
|
||||
};
|
||||
|
||||
struct CommonParameter {
|
||||
|
@ -72,3 +71,20 @@ struct LightParam {
|
|||
glm::mat4 m_LightMapMatrix;
|
||||
glm::mat4 m_WorldViewProjectionMatrix;*/
|
||||
};
|
||||
|
||||
struct SceneParameter {
|
||||
glm::vec4 m_OcclusionIntensity;
|
||||
glm::vec4 m_Wetness;
|
||||
};
|
||||
|
||||
struct CustomizeParameter {
|
||||
glm::vec4 m_SkinColor;
|
||||
glm::vec4 m_SkinFresnelValue0;
|
||||
glm::vec4 m_LipColor;
|
||||
glm::vec4 m_MainColor;
|
||||
glm::vec4 m_HairFresnelValue0;
|
||||
glm::vec4 m_MeshColor;
|
||||
glm::vec4 m_LeftColor;
|
||||
glm::vec4 m_RightColor;
|
||||
glm::vec4 m_OptionColor;
|
||||
};
|
||||
|
|
|
@ -91,12 +91,11 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
|
||||
// material data
|
||||
{
|
||||
g_MaterialParameter = m_device.createBuffer(sizeof(MaterialParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
g_MaterialParameter = m_device.createBuffer(sizeof(MaterialParameters), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
|
||||
MaterialParameter materialParameter{};
|
||||
materialParameter.g_AlphaThreshold = 0.0f;
|
||||
materialParameter.g_DiffuseColor = glm::vec3(1.0f);
|
||||
m_device.copyToBuffer(g_MaterialParameter, &materialParameter, sizeof(MaterialParameter));
|
||||
MaterialParameters materialParameter{};
|
||||
materialParameter.parameters[0] = glm::vec4(1.0f);
|
||||
m_device.copyToBuffer(g_MaterialParameter, &materialParameter, sizeof(MaterialParameters));
|
||||
}
|
||||
|
||||
// light data
|
||||
|
@ -120,6 +119,24 @@ GameRenderer::GameRenderer(Device &device, GameData *data)
|
|||
g_CommonParameter = m_device.createBuffer(sizeof(CommonParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
}
|
||||
|
||||
// scene data
|
||||
{
|
||||
g_SceneParameter = m_device.createBuffer(sizeof(SceneParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
|
||||
SceneParameter sceneParameter{};
|
||||
|
||||
m_device.copyToBuffer(g_SceneParameter, &sceneParameter, sizeof(SceneParameter));
|
||||
}
|
||||
|
||||
// customize data
|
||||
{
|
||||
g_CustomizeParameter = m_device.createBuffer(sizeof(CustomizeParameter), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||
|
||||
CustomizeParameter customizeParameter{};
|
||||
|
||||
m_device.copyToBuffer(g_CustomizeParameter, &customizeParameter, sizeof(CustomizeParameter));
|
||||
}
|
||||
|
||||
VkSamplerCreateInfo samplerInfo = {};
|
||||
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
||||
samplerInfo.magFilter = VK_FILTER_LINEAR;
|
||||
|
@ -194,6 +211,9 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
}
|
||||
|
||||
std::vector<uint32_t> systemKeys;
|
||||
if (renderMaterial.type == MaterialType::Skin) {
|
||||
systemKeys.push_back(physis_shpk_crc("DecodeDepthBuffer_RAWZ"));
|
||||
}
|
||||
std::vector<uint32_t> sceneKeys = {
|
||||
physis_shpk_crc("TransformViewSkin"),
|
||||
physis_shpk_crc("GetAmbientLight_SH"),
|
||||
|
@ -240,7 +260,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader pixelShader = renderMaterial.shaderPackage.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader);
|
||||
bindDescriptorSets(commandBuffer, pipeline, &model);
|
||||
bindDescriptorSets(commandBuffer, pipeline, &model, &renderMaterial);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &part.vertexBuffer.buffer, offsets);
|
||||
|
@ -290,7 +310,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader pixelShader = createViewPositionShpk.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, "PASS_LIGHTING_OPAQUE_VIEWPOSITION", vertexShader, pixelShader);
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr);
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_planeVertexBuffer.buffer, offsets);
|
||||
|
@ -342,7 +362,7 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca
|
|||
physis_Shader pixelShader = directionalLightningShpk.pixel_shaders[pixelShaderIndice];
|
||||
|
||||
auto &pipeline = bindPipeline(commandBuffer, pass, vertexShader, pixelShader);
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr);
|
||||
bindDescriptorSets(commandBuffer, pipeline, nullptr, nullptr);
|
||||
|
||||
VkDeviceSize offsets[] = {0};
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_planeVertexBuffer.buffer, offsets);
|
||||
|
@ -889,7 +909,7 @@ spirv_cross::CompilerGLSL GameRenderer::getShaderModuleResources(const physis_Sh
|
|||
return spirv_cross::CompilerGLSL(result.code.data(), result.code.dwords());
|
||||
}
|
||||
|
||||
VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline &pipeline, int i)
|
||||
VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, const CachedPipeline &pipeline, int i, const RenderMaterial *material)
|
||||
{
|
||||
VkDescriptorSet set;
|
||||
|
||||
|
@ -948,8 +968,12 @@ VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, cons
|
|||
info->imageView = m_viewPositionBuffer.imageView;
|
||||
} else if (strcmp(name, "g_SamplerDepth") == 0) {
|
||||
info->imageView = m_depthBuffer.imageView;
|
||||
} else if (strcmp(name, "g_SamplerNormal") == 0) {
|
||||
Q_ASSERT(material);
|
||||
info->imageView = material->normalTexture->view;
|
||||
} else {
|
||||
info->imageView = m_dummyTex.imageView;
|
||||
qInfo() << "Unknown image" << name;
|
||||
}
|
||||
|
||||
p++;
|
||||
|
@ -992,6 +1016,10 @@ VkDescriptorSet GameRenderer::createDescriptorFor(const DrawObject *object, cons
|
|||
useUniformBuffer(g_LightParam);
|
||||
} else if (strcmp(name, "g_CommonParameter") == 0) {
|
||||
useUniformBuffer(g_CommonParameter);
|
||||
} else if (strcmp(name, "g_CustomizeParameter") == 0) {
|
||||
useUniformBuffer(g_CustomizeParameter);
|
||||
} else if (strcmp(name, "g_SceneParameter") == 0) {
|
||||
useUniformBuffer(g_SceneParameter);
|
||||
} else {
|
||||
qInfo() << "Unknown resource:" << name;
|
||||
info->buffer = m_dummyBuffer.buffer;
|
||||
|
@ -1058,12 +1086,15 @@ Texture &GameRenderer::getCompositeTexture()
|
|||
return m_compositeBuffer;
|
||||
}
|
||||
|
||||
void GameRenderer::bindDescriptorSets(VkCommandBuffer commandBuffer, GameRenderer::CachedPipeline &pipeline, const DrawObject *object)
|
||||
void GameRenderer::bindDescriptorSets(VkCommandBuffer commandBuffer,
|
||||
GameRenderer::CachedPipeline &pipeline,
|
||||
const DrawObject *object,
|
||||
const RenderMaterial *material)
|
||||
{
|
||||
int i = 0;
|
||||
for (auto setLayout : pipeline.setLayouts) {
|
||||
if (!pipeline.cachedDescriptors.count(i)) {
|
||||
if (auto descriptor = createDescriptorFor(object, pipeline, i); descriptor != VK_NULL_HANDLE) {
|
||||
if (auto descriptor = createDescriptorFor(object, pipeline, i, material); descriptor != VK_NULL_HANDLE) {
|
||||
pipeline.cachedDescriptors[i] = descriptor;
|
||||
} else {
|
||||
continue;
|
||||
|
|
Loading…
Add table
Reference in a new issue