The material type of the ground node is EMT_TRANSPARENT_ALPHA_CHANNEL.
because it have warter material.
and, The material type of the shadow node is
EMT_TRANSPARENT_ALPHA_CHANNEL, too.
but...the shadow is not drawn sometimes correctly.
what should i do?
[img]
http://3dcg-yotuba.com/uploader/src/up0068.jpg
[/img]
below is test .exe , model files, and image files.
you can find this problem.
http://3dcg-yotuba.com/uploader/src/up0069.zip
and dll was fixed famous zbuffer problem in EDT_DIRECT3D9.
-------------------------------------------------------------------
CD3D9MaterialRenderer.h
class CD3D9MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public CD3D9MaterialRenderer
/*
((SMaterial&)material).ZWriteEnable = false;
*/
-------------------------------------------------------------------
below is full source code
Code: Select all
#include "windows.h"
#include "irrlicht.h"
#include "ISkinnedMesh.h"
#pragma comment(lib,"irrlicht.lib")
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
IrrlichtDevice* Device = createDevice(video::EDT_DIRECT3D9, dimension2d<s32>(1024, 768), 16, false, false,true);
IVideoDriver *Driver = Device->getVideoDriver();
ISceneManager *Scene = Device->getSceneManager();
IGUIEnvironment* gui = Device->getGUIEnvironment();
IGUIFont *font = gui->getBuiltInFont();
ICursorControl* cursor = Device->getCursorControl();
ICameraSceneNode *camera;
camera = Scene->addCameraSceneNode(0, vector3df(0,4,-4), vector3df(0,0,0));
camera->setUpVector(vector3df(0.0f,1.0f,0.0f));
matrix4 projMat;
projMat.buildProjectionMatrixPerspectiveFovLH(45.0f,1.3333f,1.0f,20000.0f);
camera->setProjectionMatrix(projMat);
ILightSceneNode *light1 = Scene->addLightSceneNode(0, vector3df(0,2,0), SColorf(.5f, .5f, .5f), 50.0f);
light1->getLightData().Type = ELT_DIRECTIONAL;
light1->getLightData().AmbientColor = SColorf(.5f,.5f,.5f);
//ground node
IAnimatedMesh* terraMesh = Scene->getMesh("terra_alp.x");
ISceneNode* terraNode = Scene->addOctTreeSceneNode(terraMesh->getMesh(0));
ITriangleSelector* selector= Scene->createOctTreeTriangleSelector(terraMesh,terraNode,32);
terraNode->setTriangleSelector(selector);
terraNode->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL );
//shadow node (texture alpha)
IAnimatedMesh* shadowMesh = Scene->getMesh("shadow_alp.x");
IAnimatedMeshSceneNode* shadowNode = Scene->addAnimatedMeshSceneNode(shadowMesh);
shadowNode->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL);
shadowNode->getMaterial(0).MaterialTypeParam = 0.01f;
shadowNode->setDebugDataVisible(1);
/*
//create shadow node (vertex alpha)
IAnimatedMesh* shadowMesh = Scene->getMesh("shadow_valp.x");
IAnimatedMeshSceneNode* shadowNode = Scene->addAnimatedMeshSceneNode(shadowMesh);
shadowNode->setMaterialType(EMT_TRANSPARENT_VERTEX_ALPHA);
shadowNode->setMaterialFlag(EMF_LIGHTING,false);
*/
while(Device->run())
{
Driver->beginScene(true, true, SColor(0,0,100,100));
//get mouse intersection
vector3df out;
triangle3df tri;
line3df ray;
ray = Scene->getSceneCollisionManager()->getRayFromScreenCoordinates(cursor->getPosition(),camera);
if(Scene->getSceneCollisionManager()->getCollisionPoint(ray,selector,out,tri))
{
//alline ground normal with shadow
shadowNode->setPosition(out + vector3df(0, 0.1f, 0));
shadowNode->setRotation(tri.getNormal().getHorizontalAngle() + vector3df(90, 0, 0));
}
Scene->drawAll();
Driver->endScene();
}
Device->drop();
return 0;
}