Where is wrong?
there's my code
Code: Select all
// Class automatically generated by Dev-C++ New Class wizard
#ifndef CSHADERCALLBACK_H
#define CSHADERCALLBACK_H
#include <irrlicht.h>
#pragma comment(lib, "Irrlicht.lib")
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
/**
* Chiamata per l'esecuzione di un fitro come shader
*/
class cMyShaderCallBack : public video::IShaderConstantSetCallBack
{
public:
float viewport_inv_width;
float viewport_inv_height;
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
services->setVertexShaderConstant("viewport_inv_width", reinterpret_cast<f32*>(&viewport_inv_width), 1);
services->setVertexShaderConstant("viewport_inv_height", reinterpret_cast<f32*>(&viewport_inv_height), 1);
}
};
#endif // CSHADERCALLBACK_H
Code: Select all
// Class automatically generated by Dev-C++ New Class wizard
#ifndef CBASEFILTER__H
#define CBASEFILTER__H
#include <irrlicht.h>
#include "cmyshadercallback.h"
#pragma comment(lib, "Irrlicht.lib")
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
/**
* Filtro base per il post processing
*/
class CBaseFilter : public scene::ISceneNode
{
core::aabbox3d<f32> Box;
video::S3DVertex Vertices[6];
public:
video::SMaterial Material;
c8* vsFileName; // filename for the vertex shader
c8* psFileName; // filename for the pixel shader
int newMaterialType1;
cMyShaderCallBack* mc;
video::ITexture* rt0;
int alto;
int ancho;
public:
CBaseFilter(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id)
: scene::ISceneNode(parent, mgr, id)
{
Material.Wireframe = false;
Material.Lighting = false;
Vertices[0] = video::S3DVertex(-1.0f, -1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 0.0f, 1.0f);
Vertices[1] = video::S3DVertex(-1.0f, 1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 0.0f, 0.0f);
Vertices[2] = video::S3DVertex( 1.0f, 1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 1.0f, 0.0f);
Vertices[3] = video::S3DVertex( 1.0f, -1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 1.0f, 1.0f);
Vertices[4] = video::S3DVertex(-1.0f, -1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 0.0f, 1.0f);
Vertices[5] = video::S3DVertex( 1.0f, 1.0f, 0.0f,1,1,0, video::SColor(255,0,255,255), 1.0f, 0.0f);
Box.reset(Vertices[0].Pos);
for (s32 i=1; i<4; ++i)
Box.addInternalPoint(Vertices[i].Pos);
mc = new cMyShaderCallBack();
video::IVideoDriver* driver = SceneManager->getVideoDriver();
rt0 = driver->createRenderTargetTexture(core::dimension2d<s32>(800,600));
setMaterialTexture(0, rt0);
}
virtual void OnPreRender()
{
if (IsVisible)
//SceneManager->registerNodeForRendering(this);
ISceneNode::OnPreRender();
}
virtual void render()
{
u16 indices[] = {0,1,2,3,4,5};
video::IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setMaterial(Material);
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
driver->drawIndexedTriangleList(&Vertices[0], 6, &indices[0], 2);
}
virtual const core::aabbox3d<f32>& getBoundingBox() const
{
return Box;
}
virtual s32 getMaterialCount()
{
return 1;
}
virtual video::SMaterial& getMaterial(s32 i)
{
return Material;
}
};
#endif // CBASEFILTER__H
Code: Select all
void Game::InitPostProcess(void)
{
video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
//1)create of object
myFilter = new CBaseFilter(smgr->getRootSceneNode(), smgr, 666);
if(myFilter==NULL)
{
printf("errore caricamento Filter");
}
//2)select shader
myFilter->psFileName = "bw.vert";
myFilter->vsFileName = "bw.frag";
//3)create "new material shader" and associate with filter
myFilter->newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(
myFilter->vsFileName,"vertexMain", video::EVST_VS_3_0,
myFilter->psFileName, "pixelMain", video::EPST_PS_3_0,
myFilter->mc, video::EMT_SOLID);
myFilter->setMaterialType((video::E_MATERIAL_TYPE)myFilter->newMaterialType1);
//4) pass the constant-variables to IShaderConstantSetCallBack
myFilter->mc->viewport_inv_height=1/600;
myFilter->mc->viewport_inv_width=1/800;
myFilter->drop();
}
Code: Select all
if( PostPocess==true)
{
driver->beginScene(true, true, video::SColor(0,100,100,100));
driver->setRenderTarget(myFilter->rt0,true, true, video::SColor(0,0,0,255));
smgr->drawAll();
driver->setRenderTarget(0);
myFilter->render();
driver->endScene();
}
else
{
driver->beginScene(true, true, video::SColor(0,100,100,100));
driver->setRenderTarget(0,true, true, video::SColor(0,0,0,255));
smgr->drawAll();
driver->endScene();
}
[/quote]