gpt4 book ai didi

c++ - Ogre3d/通过合成器监听器访问传递并传递标识符

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:27 26 4
gpt4 key购买 nike

我正在尝试使用 Ogre 1.8 实现延迟着色。这是我的最终合成器:

compositor DeferredShadingShowLit
{
technique
{
texture rt0 target_width target_height PF_A8R8G8B8
texture_ref mrt_output DeferredShadingGBuffer mrt_output

target rt0
{
input none
shadows off

pass clear
{
identifier 1
}

pass render_quad
{
identifier 2
material DeferredShadingPostQuadLight
input 0 mrt_output 0
input 1 mrt_output 1
}
}

target_output
{
input none

pass render_quad
{
identifier 3
material DeferredShadingFinal
input 0 rt0
}
}
}
}

我需要将灯光位置传递给 DeferredShadingPostQuadLight Material (用于渲染灯光),每一帧都会更改。这是一个简单的例子,我还没有实现任何优化,例如 z 测试和灯光的边界体积。为此,我使用以这种方式设置的合成器监听器:

class LightListener : public Ogre::CompositorInstance::Listener
{
public:

LightListener(Ogre::Vector3 alightPos);
virtual ~LightListener();
virtual void notifyMaterialSetup(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat);
virtual void notifyMaterialRender(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat);

Ogre::Vector3 lightPos;
Ogre::GpuProgramParametersSharedPtr fpParams;
};

LightListener::LightListener(Ogre::Vector3 alightPos)
{
lightPos = alightPos;
}

LightListener::~LightListener()
{
}

void LightListener::notifyMaterialSetup(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat)
{
//if (pass_id == 2) // This gives me error
fpParams = mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters();
}

void LightListener::notifyMaterialRender(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat)
{
//if (pass_id == 2) // This gives me error
fpParams->setNamedConstant("lightPos", lightPos);
}

问题是我无法通过上面注释行中显示的 ID 访问通行证。

但是,如果这些行被注释掉并且我像这样更改合成器脚本:

compositor DeferredShadingShowLit
{
technique
{
texture rt0 target_width target_height PF_A8R8G8B8
texture_ref mrt_output DeferredShadingGBuffer mrt_output

target_output
{
input none
shadows off

pass clear
{
}

pass render_quad
{
material DeferredShadingPostQuadLight
input 0 mrt_output 0
input 1 mrt_output 1
}
}
}
}

DeferredShadingPostQuadLight Material 的片段程序在每一帧都得到更新,没有任何问题。

我需要先渲染到rt0,然后才渲染到target_output。你能告诉我我在这里做错了什么吗?谢谢!

最佳答案

我终于明白了! Ogre 论坛上的答案常常具有误导性。我跟踪了 pass_id 变量 - 你提供给继承的虚函数 notifyMaterialSetup 的那个和你放在这里的那个 mat->getBestTechnique()->getPass(pass_id ) 实际上是完全不同的值。我不知道为什么整个 Internet 上的示例都有这样的代码。这是完全错误的。 pass_id 是指合成器 channel ,而 mat->getBestTechnique()->getPass(pass_id)pass_id 是指 Material channel 。我通过像这样更改代码让我自己的示例工作:

void LightListener::notifyMaterialSetup(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat)
{
if (pass_id == 2)
fpParams = mat->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
// I put 0 here because my material has only one pass
}

void LightListener::notifyMaterialRender(Ogre::uint32 pass_id, Ogre::MaterialPtr &mat)
{
if (pass_id == 2)
fpParams->setNamedConstant("lightPos", lightPos);
}

感谢您的关注!

关于c++ - Ogre3d/通过合成器监听器访问传递并传递标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com