Created
November 24, 2012 11:56
-
-
Save assaframan/4139350 to your computer and use it in GitHub Desktop.
min code to render OGRE with d3d11 render system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <conio.h> | |
#include "Ogre.h" | |
#include "OgreFrameListener.h" | |
#include "OgreShaderGenerator.h" | |
///////////////////////////////////////////////////////////////////////////////////////////////// | |
class ShaderGeneratorTechniqueResolverListener : public Ogre::MaterialManager::Listener | |
{ | |
public: | |
ShaderGeneratorTechniqueResolverListener(Ogre::RTShader::ShaderGenerator* pShaderGenerator) | |
{ | |
mShaderGenerator = pShaderGenerator; | |
} | |
/** This is the hook point where shader based technique will be created. | |
It will be called whenever the material manager won't find appropriate technique | |
that satisfy the target scheme name. If the scheme name is out target RT Shader System | |
scheme name we will try to create shader generated technique for it. | |
*/ | |
virtual Ogre::Technique* handleSchemeNotFound(unsigned short schemeIndex, | |
const Ogre::String& schemeName, Ogre::Material* originalMaterial, unsigned short lodIndex, | |
const Ogre::Renderable* rend) | |
{ | |
Ogre::Technique* generatedTech = NULL; | |
// Case this is the default shader generator scheme. | |
if (schemeName == Ogre::RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME) | |
{ | |
bool techniqueCreated; | |
// Create shader generated technique for this material. | |
techniqueCreated = mShaderGenerator->createShaderBasedTechnique( | |
originalMaterial->getName(), | |
Ogre::MaterialManager::DEFAULT_SCHEME_NAME, | |
schemeName); | |
// Case technique registration succeeded. | |
if (techniqueCreated) | |
{ | |
// Force creating the shaders for the generated technique. | |
mShaderGenerator->validateMaterial(schemeName, originalMaterial->getName()); | |
// Grab the generated technique. | |
Ogre::Material::TechniqueIterator itTech = originalMaterial->getTechniqueIterator(); | |
while (itTech.hasMoreElements()) | |
{ | |
Ogre::Technique* curTech = itTech.getNext(); | |
if (curTech->getSchemeName() == schemeName) | |
{ | |
generatedTech = curTech; | |
break; | |
} | |
} | |
} | |
} | |
return generatedTech; | |
} | |
protected: | |
Ogre::RTShader::ShaderGenerator* mShaderGenerator; // The shader generator instance. | |
}; | |
///////////////////////////////////////////////////////////////////////////////////////////////// | |
class MinFrameListener : public Ogre::FrameListener | |
{ | |
bool frameEnded(const Ogre::FrameEvent& evt) | |
{ | |
return _kbhit() == 0; | |
} | |
} minFrameListener; | |
///////////////////////////////////////////////////////////////////////////////////////////////// | |
int main() | |
{ | |
Ogre::Root root( | |
#ifdef _DEBUG | |
"plugins_d.cfg" | |
#endif | |
); | |
if (!root.restoreConfig()) | |
{ | |
root.showConfigDialog(); | |
} | |
Ogre::RenderWindow* window = root.initialise(true); | |
Ogre::SceneManager* sceneManager = root.createSceneManager(Ogre::ST_GENERIC); | |
Ogre::Camera* camera = sceneManager->createCamera("Camera1"); | |
camera->setPosition(0, 30, 350); | |
window->addViewport(camera); | |
Ogre::RTShader::ShaderGenerator::initialize(); | |
Ogre::RTShader::ShaderGenerator * shaderGenerator = Ogre::RTShader::ShaderGenerator::getSingletonPtr(); | |
shaderGenerator->addSceneManager(sceneManager); | |
ShaderGeneratorTechniqueResolverListener materialMgrListener(shaderGenerator); | |
Ogre::MaterialManager::getSingleton().addListener(&materialMgrListener); | |
sceneManager->setAmbientLight(Ogre::ColourValue(0.75, 0.75, 0.75)); | |
Ogre::Light* light = sceneManager->createLight(); | |
light->setPosition(2000, 1000, -1000); | |
// load resource paths from config file | |
Ogre::ConfigFile cf; | |
#ifdef _DEBUG | |
cf.load("resources_d.cfg"); | |
#else | |
cf.load("resources.cfg"); | |
#endif | |
Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); | |
Ogre::String sec, type, arch; | |
// go through all specified resource groups | |
while (seci.hasMoreElements()) | |
{ | |
sec = seci.peekNextKey(); | |
Ogre::ConfigFile::SettingsMultiMap* settings = seci.getNext(); | |
Ogre::ConfigFile::SettingsMultiMap::iterator i; | |
// go through all resource paths | |
for (i = settings->begin(); i != settings->end(); i++) | |
{ | |
type = i->first; | |
arch = i->second; | |
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(arch, type, sec); | |
} | |
} | |
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); | |
Ogre::Entity* head = sceneManager->createEntity("Head", "ogrehead.mesh"); | |
sceneManager->getRootSceneNode()->attachObject(head); | |
root.addFrameListener(&minFrameListener); | |
root.startRendering(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment