WIP adding shader reflection to KRMaterial.

KRNode::RenderInfo now maintains a stack of reflected objects.
WIP adding shader reflection to KRNode.
This commit is contained in:
2025-08-31 01:45:34 -07:00
parent 6ccbecda3c
commit 37b266dc11
4 changed files with 80 additions and 22 deletions

View File

@@ -634,12 +634,15 @@ void KRPipeline::updatePushConstants(KRNode::RenderInfo& ri, const Matrix4& matM
{ {
KRModelView modelView(ri.viewport, matModel); KRModelView modelView(ri.viewport, matModel);
std::vector<const KRReflectedObject*> objects = { ri.reflectedObjects.push_back(&modelView);
&modelView, ri.reflectedObjects.push_back(ri.viewport);
ri.viewport, ri.reflectedObjects.push_back(&ri.camera->settings);
&ri.camera->settings
}; setPushConstants(ri.reflectedObjects);
setPushConstants(objects);
ri.reflectedObjects.pop_back();
ri.reflectedObjects.pop_back();
ri.reflectedObjects.pop_back();
setPushConstant(ShaderValue::absolute_time, getContext().getAbsoluteTime()); setPushConstant(ShaderValue::absolute_time, getContext().getAbsoluteTime());

View File

@@ -35,6 +35,7 @@
#include "KRViewport.h" #include "KRViewport.h"
#include "KROctreeNode.h" #include "KROctreeNode.h"
#include "KRBehavior.h" #include "KRBehavior.h"
#include "KRShaderReflection.h"
using namespace kraken; using namespace kraken;
@@ -62,7 +63,9 @@ class XMLNode;
class XMLAttribute; class XMLAttribute;
} }
class KRNode : public KRContextObject class KRNode
: public KRContextObject
, public KRReflectedObject
{ {
public: public:
@@ -94,6 +97,8 @@ public:
KRViewport* viewport; KRViewport* viewport;
KRRenderPass* renderPass; KRRenderPass* renderPass;
KRPipeline* pipeline; KRPipeline* pipeline;
std::vector<const KRReflectedObject*> reflectedObjects;
}; };
static void InitNodeInfo(KrNodeInfo* nodeInfo); static void InitNodeInfo(KrNodeInfo* nodeInfo);

View File

@@ -412,7 +412,6 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_
} }
} }
pShader->setPushConstant(ShaderValue::material_ambient, m_ambientColor + ri.camera->settings.ambient_intensity); pShader->setPushConstant(ShaderValue::material_ambient, m_ambientColor + ri.camera->settings.ambient_intensity);
if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_OPAQUE) { if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_OPAQUE) {
@@ -429,19 +428,6 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_
pShader->setPushConstant(ShaderValue::material_specular, m_specularColor); pShader->setPushConstant(ShaderValue::material_specular, m_specularColor);
} }
pShader->setPushConstant(ShaderValue::material_shininess, m_ns);
pShader->setPushConstant(ShaderValue::material_reflection, m_reflectionColor);
pShader->setPushConstant(ShaderValue::diffusetexture_scale, m_diffuseMapScale);
pShader->setPushConstant(ShaderValue::speculartexture_scale, m_specularMapScale);
pShader->setPushConstant(ShaderValue::reflectiontexture_scale, m_reflectionMapScale);
pShader->setPushConstant(ShaderValue::normaltexture_scale, m_normalMapScale);
pShader->setPushConstant(ShaderValue::diffusetexture_offset, m_diffuseMapOffset);
pShader->setPushConstant(ShaderValue::speculartexture_offset, m_specularMapOffset);
pShader->setPushConstant(ShaderValue::reflectiontexture_offset, m_reflectionMapOffset);
pShader->setPushConstant(ShaderValue::normaltexture_offset, m_normalMapOffset);
pShader->setPushConstant(ShaderValue::material_alpha, m_tr);
if (bDiffuseMap) { if (bDiffuseMap) {
m_pDiffuseMap->resetPoolExpiry(lod_coverage, KRTexture::TEXTURE_USAGE_DIFFUSE_MAP); m_pDiffuseMap->resetPoolExpiry(lod_coverage, KRTexture::TEXTURE_USAGE_DIFFUSE_MAP);
pShader->setImageBinding("diffuseTexture", m_pDiffuseMap, getContext().getSamplerManager()->DEFAULT_WRAPPING_SAMPLER); pShader->setImageBinding("diffuseTexture", m_pDiffuseMap, getContext().getSamplerManager()->DEFAULT_WRAPPING_SAMPLER);
@@ -467,7 +453,9 @@ void KRMaterial::bind(KRNode::RenderInfo& ri, ModelFormat modelFormat, __uint32_
pShader->setImageBinding("reflectionTexture", m_pReflectionMap, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER); pShader->setImageBinding("reflectionTexture", m_pReflectionMap, getContext().getSamplerManager()->DEFAULT_CLAMPED_SAMPLER);
} }
ri.reflectedObjects.push_back(this);
pShader->bind(ri, matModel); pShader->bind(ri, matModel);
ri.reflectedObjects.pop_back();
} }
const std::string& KRMaterial::getName() const const std::string& KRMaterial::getName() const
@@ -475,3 +463,57 @@ const std::string& KRMaterial::getName() const
return m_name; return m_name;
} }
bool KRMaterial::getShaderValue(ShaderValue value, float* output) const
{
switch (value) {
case ShaderValue::material_alpha:
*output = m_tr;
return true;
case ShaderValue::material_shininess:
*output = m_ns;
return true;
}
return false;
}
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector2* output) const
{
switch (value) {
case ShaderValue::diffusetexture_scale:
*output = m_diffuseMapScale;
return true;
case ShaderValue::speculartexture_scale:
*output = m_specularMapScale;
return true;
case ShaderValue::reflectiontexture_scale:
*output = m_reflectionMapScale;
return true;
case ShaderValue::normaltexture_scale:
*output = m_normalMapScale;
return true;
case ShaderValue::diffusetexture_offset:
*output = m_diffuseMapOffset;
return true;
case ShaderValue::speculartexture_offset:
*output = m_specularMapOffset;
return true;
case ShaderValue::reflectiontexture_offset:
*output = m_reflectionMapOffset;
return true;
case ShaderValue::normaltexture_offset:
*output = m_normalMapOffset;
return true;
}
return false;
}
bool KRMaterial::getShaderValue(ShaderValue value, hydra::Vector3* output) const
{
switch (value) {
case ShaderValue::material_reflection:
*output = m_reflectionColor;
return true;
}
return false;
}

View File

@@ -42,6 +42,7 @@
#include "resources/KRResource.h" #include "resources/KRResource.h"
#include "resources/scene/KRScene.h" #include "resources/scene/KRScene.h"
#include "nodes/KRBone.h" #include "nodes/KRBone.h"
#include "KRShaderReflection.h"
enum class CullMode : __uint32_t; enum class CullMode : __uint32_t;
enum class ModelFormat : __uint8_t; enum class ModelFormat : __uint8_t;
@@ -50,7 +51,9 @@ class KRTextureManager;
class KRContext; class KRContext;
class KRSurface; class KRSurface;
class KRMaterial : public KRResource class KRMaterial
: public KRResource
, public KRReflectedObject
{ {
public: public:
typedef enum typedef enum
@@ -137,4 +140,9 @@ private:
alpha_mode_type m_alpha_mode; alpha_mode_type m_alpha_mode;
void getTextures(); void getTextures();
private:
bool getShaderValue(ShaderValue value, float* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector2* output) const final;
bool getShaderValue(ShaderValue value, hydra::Vector3* output) const final;
}; };