Ich habs grad auch mal mit DirectX8 gemacht, nur mit 9, da gibts Probleme, Aber warum? Meine Graka unterstützt DirectX10 und Shader Version 4, liegts an der DX installation? Soll ich einfach mal neu installieren? Naja, ich hab auf jeden Fall mal so das Example auf mein Prog übertragen, und wenn ich es starte krieg ich keine Fehlermeldung aber sobald er dann von der Konsole ins Fullscreen springt stürzt das Programm ab und diese Windowsmeldung mit "Programm reagiert nicht, wollen sie ein Bericht an Microsoft schicken?" kommt, ich geb euch einfach mal das ganze Prog, weil ich kein Plan habe woran das jetzt liegen könnte...
Code:
#include <irrlicht.h>
#include <iostream>
using namespace irr;
using namespace std;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
#pragma comment(lib, "Irrlicht.lib")
//--------------------------------------------------------------------Vorbereitungen für den Shader
IrrlichtDevice* device = 0;
class MyShaderCallBack : public video::IShaderConstantSetCallBack
{
public:
virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
{
video::IVideoDriver* driver = services->getVideoDriver();
//--------------------------------------------------------------------Setze invertierte Welt Matrix
core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
invWorld.makeInverse();
services->setVertexShaderConstant(invWorld.pointer(), 0, 4);
//-------------------------------------------------------------------------------Clip Matrix setzen
core::matrix4 worldViewProj;
worldViewProj = driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4);
core::vector3df pos = device->getSceneManager()->
getActiveCamera()->getAbsolutePosition();
services->setVertexShaderConstant(reinterpret_cast<f32*>(&pos), 8, 1);
// set light color
video::SColorf col(0.0f,1.0f,1.0f,0.0f);
services->setVertexShaderConstant(reinterpret_cast<f32*>(&col), 9, 1);
// set transposed world matrix
core::matrix4 world = driver->getTransform(video::ETS_WORLD);
world = world.getTransposed();
services->setVertexShaderConstant(world.pointer(), 10, 4);
}
};
int main()
{
cout << "-------------------------------------------------------------------------------\n";
cout << ">>>>>>>>>>>>>>>>>>>>>Bitte warten, es wird initialisiert<<<<<<<<<<<<<<<<<<<<<<<\n";
cout << "-------------------------------------------------------------------------------\n";
IrrlichtDevice *device = createDevice(EDT_DIRECT3D8, dimension2d<s32>(1024, 768), 32, true, true);
device->setWindowCaption(L"Project");
video::IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
//--------------------------------------------------------------------------------------------Boden
IAnimatedMesh *bodenMesh = smgr->getMesh("Boden.3ds");
IMeshSceneNode *bodenNode = smgr->addMeshSceneNode(bodenMesh->getMesh(0),0,-1,vector3df(0,0,0));
bodenNode->setMaterialFlag(EMF_LIGHTING, false);
//-------------------------------------------------------------------------Kamera und ihre Bewegung
scene::ICameraSceneNode *camera = smgr->addCameraSceneNode(0, vector3df(100,200,-100), vector3df(0,50,0));
scene::ISceneNodeAnimator* camAnimator = 0;
camAnimator = smgr->createFlyCircleAnimator (core::vector3df(0,150,0),250.0f,0.0002);
camera->addAnimator(camAnimator);
camAnimator->drop();
//--------------------------------------------------------------------------------------------Nebel
driver->setFog(video::SColor(255,100,101,140), true, 600, 1000, 0, true);
bodenNode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
//-------------------------------------------------------------------------Licht und seine Bewegung
scene::ISceneNode* lichtNode = 0;
lichtNode = smgr->addLightSceneNode(0, core::vector3df(0,0,0),video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 300.0f);
scene::ISceneNodeAnimator* lichtAnimator = 0;
lichtAnimator = smgr->createFlyCircleAnimator (core::vector3df(0,50,0),50.0f,0.0001);
lichtNode->addAnimator(lichtAnimator);
lichtAnimator->drop();
//-----------------------------------------------------------------Robotermodel und dessen Schatten
//Roboter
scene::IAnimatedMesh* roboMesh = 0;
roboMesh = smgr->getMesh("Robo.md2");
scene::IAnimatedMeshSceneNode* roboNode = 0;
roboNode = smgr->addAnimatedMeshSceneNode(roboMesh);
roboNode->setFrameLoop(0, 100);
roboNode->setAnimationSpeed(1);
roboNode->setPosition(core::vector3df(0,0,0));
roboNode->setScale(core::vector3df(0.1,0.1,0.1));
roboNode->setMaterialFlag(video::EMF_LIGHTING, false);
roboNode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true);
//Seine Shader
s32 materialShader = 0;
video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
MyShaderCallBack* shaderCallback = new MyShaderCallBack();
materialShader = gpu->addShaderMaterialFromFiles("d3d8.vsh", "d3d8.psh", shaderCallback, video::EMT_TRANSPARENT_ADD_COLOR);
roboNode->setMaterialType((video::E_MATERIAL_TYPE)materialShader);
//Dessen Schatten
roboNode->addShadowVolumeSceneNode();
smgr->setShadowColor(video::SColor(150,0,0,0));
//------------------------------------------------------------------------------------Hauptschleife
while(device->run())
{
driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
guienv->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
Ist zwar ne Menge, aber hoffentlich könnt ihr mir ein bisschen Helfen, ist ja auch n bisschen ausdokumentiert...
Mfg
Blitz303
EDIT: Ok, der Fehler war die Robo.Md2 Datei, sie scheint fehlerhaft zu sein. Aber wenn ich es jetzt mit einem anderen Objekt versuche ist das Objekt einfach unsichtbar, egal ob ich den Shader EMT_TRANSPARENT_ADD_COLOR oder EMT_SOLID nehme, nix zu sehen. Aber wenn ich den Shader nicht zu dem Node zuweise seh ich das Objekt wieder also muss es ja irgendwie mit dem Shader zu tun haben...