1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-23 20:47:45 +00:00

Implement some stuff required for skin shaders

Punching some holes to allow shaders to access textures
This commit is contained in:
Joshua Goins 2024-04-21 19:45:21 -04:00
parent af806bff63
commit 74f754b382
4 changed files with 67 additions and 17 deletions

2
extern/libphysis vendored

@ -1 +1 @@
Subproject commit 5241b087e4514cabd4dc825a8ec56ff33d4350ea
Subproject commit 5b023199fa04fbaf550c78e5d06f302a307132a7

View file

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

View file

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

View file

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