Is it possible, I was planing to combine the slidebar from the tutorial no.5 with a shader. So that when that the user moves the slidebar the parameters of the shader change.
Can this be done?
Changing a uniform shader variable on the fly?
Some question on not an unrelated note: Can I set the shader constant callback thingy after the new material was with one of the methods in GPUProgrammingServices, or can it be only done when creating the new material type?
irrRenderer 1.0
Height2Normal v. 2.1 - convert height maps to normal maps
Step back! I have a void pointer, and I'm not afraid to use it!
Height2Normal v. 2.1 - convert height maps to normal maps
Step back! I have a void pointer, and I'm not afraid to use it!
What about something like this, wouldn't it help?
Code: Select all
class ShaderMaterialControler : public video::IMaterialRenderer,
public video::IShaderConstantSetCallBack
{
video::IMaterialRenderer *ShaderMaterialRenderer;
const video::SMaterial *Material;
public:
ShaderMaterialControler(video::IVideoDriver *driver, const c8 *vertexShaderFilename, const c8 *fragmentShaderFilename, s32 &materialID, const c8 *materialName)
{
video::IGPUProgrammingServices *services = driver->getGPUProgrammingServices();
s32 mID = services->addHighLevelShaderMaterialFromFiles(
vertexShaderFilename, "main", video::EVST_VS_1_1,
fragmentShaderFilename, "main", video::EPST_PS_1_1,
this, video::EMT_SOLID);
materialID = driver->addMaterialRenderer(this, "materialName");
ShaderMaterialRenderer = driver->getMaterialRenderer(mID);
}
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
if(driver->getDynamicLightCount() > 0)
{
u32 type = (u32)Device->getVideoDriver()->getDynamicLight(0).Type;
services->setVertexShaderConstant("LightType0", (f32*)&type, 1);
}
if(driver->getDynamicLightCount() > 1)
{
u32 type = (u32)Device->getVideoDriver()->getDynamicLight(1).Type;
services->setVertexShaderConstant("LightType1", (f32*)&type, 1);
}
if(driver->getDynamicLightCount() > 2)
{
u32 type = (u32)Device->getVideoDriver()->getDynamicLight(2).Type;
services->setVertexShaderConstant("LightType2", (f32*)&type, 1);
}
}
void OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial,
bool resetAllRenderstates, video::IMaterialRendererServices* services)
{
Material = &material;
ShaderMaterialRenderer->OnSetMaterial(material, lastMaterial, resetAllRenderstates, services);
}
bool OnRender(video::IMaterialRendererServices *services, video::E_VERTEX_TYPE vtxtype)
{
return ShaderMaterialRenderer->OnRender(services, vtxtype);
}
void OnUnsetMaterial()
{
ShaderMaterialRenderer->OnUnsetMaterial();
}
bool isTransparent()
{
return ShaderMaterialRenderer->isTransparent();
}
s32 getRenderCapability()
{
return ShaderMaterialRenderer->getRenderCapability();
}
};