OpenGL x.x.x vs 3D Engine



  • Ich möchte ein Strategiespiel wie Starcraft oder Age of Empires erstellen, dafür brauche ich eine 3D Engine. Mit SFML habe ich schon viel gemacht und hier kann man auch sehr einfach OpenGl einbinden. Meine Fragen sind:

    Welche Version sollte man heute lernen/nutzen damit sie auch bei jeden Rechner funktioniert ?

    Ist es besser eine 3D Engine für so etwas zu nutzen oder ist es einfacher mit Opengl?

    Wie man an denn Fragen sehen kann habe ich kaum ahnung davon, ich will einfach nichts falsches lernen.



  • Ich würde Ogre3d nutzen. 👍



  • OpenGL ist jedenfalls sicherlich nicht einfacher. Es gibt gefuehlte 1 Mio. Fallstricke. Nimm ne Engine.



  • Jede Engine bringt ihre eigenen Eigenheiten und Beschränkungen mit sich. Um wirklich alles machen zu können musst du OpenGL können. Aber die meisten Engines sind auch bequemer. Meist lassen sie sich auch problemlos erweitern, wenn man an eine Grenze stößt.



  • Um auf PCs die GPU anzusprechen muss man OpenGL oder Direct3D verwenden.
    Auf diesen APIs bauen dann Engines wie Ogre3D, Unity, etc... auf.

    Wenn es dir darum geht ein Spiel zu erstellen dann solltest du eine der engines benutzen.
    Man benötigt einiges an Zeit um sich einzuarbeiten, jedoch nehmen diese dir sehr viel mehr Arbeit ab als du reinsteckst!





  • du hast sie, die wohl meistgestellte frage. Und es gibt auf die Frage auch keine antwort, weil sie zu unpräzise ist, tut mir leid. Mein tipp: lern OpenGl nicht ohne jemanden mit erfahrung. Es ist scheiße viel arbeit der weg ist hart, und das war rauskommt ist oft extrem wenig und kaum etwas das man Spiel nennen könnte. Nimmst du eine Engine ist der Weg leichter, aber man wächst auch mit den herausforderungen.



  • OpenGL wird doch jetzt eh wieder grundlegend geändert, um mit dem Mantel von AMD oder wie das heißt mithalten zu können. Heute kann man eh allein gar nichts mehr bewegen, also nimm eine Engine und selbst damit wird du nur was für dich zum Lernen hinbekommen.



  • Danke für die Antworten, ich habe gerade Ogre3d ausprobiert, leider habe ich Probleme mit der Speicherverwaltung. Ist es in Ogre3d nicht möglich mit smart_pointern zu arbeiten, mit SFML hat das immer super funktioniert.

    #include <iostream>
    #include <OGRE/Ogre.h>
    #include <OGRE/OgreException.h>
    #include <OGRE/OgreRoot.h>
    #include <OIS/OIS.h>
    
    #include <utility>
    #include <string>
    #include <memory>
    
    bool running = true;
    
    void handleKeyboard( std::unique_ptr<OIS::Keyboard>& keyboard )
    {
        keyboard->capture();
        if( keyboard->isKeyDown( OIS::KC_ESCAPE ) )
        {
            running = false;
        }
    }
    
    void handleMouse( std::unique_ptr<OIS::Mouse>& mouse )
    {
        mouse->capture();
    }
    
    int main()
    {
        try
        {
            std::unique_ptr< Ogre::Root > root( new Ogre::Root("pluginsLinux.cfg") );
    
            if( !root->showConfigDialog() )
                return 1;
    
            std::unique_ptr< Ogre::RenderWindow > window( root->initialise(true) );
            std::unique_ptr< Ogre::SceneManager > sceneManager( root->createSceneManager( Ogre::ST_GENERIC ) );
            std::unique_ptr< Ogre::Camera > camera ( sceneManager->createCamera( "mainCamera" ) );
            std::unique_ptr< Ogre::SceneNode > cameraNode( sceneManager->getRootSceneNode()->createChildSceneNode() );
            std::unique_ptr< Ogre::Viewport > viewport( window->addViewport(camera.get()) );
    
            camera->setNearClipDistance(5);
            camera->setFarClipDistance(100);
            cameraNode->attachObject(camera.get());
            viewport->setClearEveryFrame(true);
    
            OIS::ParamList pl;
            size_t windowHnd = 0;
            window->getCustomAttribute("WINDOW", &windowHnd);
            pl.insert( std::make_pair( std::string("WINDOW"), std::to_string( windowHnd ) ) );
    
            OIS::InputManager* inputManager =  OIS::InputManager::createInputSystem( pl );
    
            std::unique_ptr<OIS::Keyboard>    keyboard ( static_cast<OIS::Keyboard*>( inputManager->createInputObject( OIS::OISKeyboard, false ) ) );
            std::unique_ptr<OIS::Mouse>       mouse( static_cast<OIS::Mouse*>( inputManager->createInputObject( OIS::OISMouse, false ) ) );
    
            while( !window->isClosed() && running!=false )
            {
                root->renderOneFrame();
                Ogre::WindowEventUtilities::messagePump();
                handleKeyboard( keyboard );
                handleMouse( mouse );
            }
            inputManager = nullptr;
        }
        catch( const Ogre::Exception& ex )
        {
            std::cout << ex.what();
        }
    }
    

    Der Debugger sagt das SceneManager gelöscht wird und ein anderes Object noch mal SceneManager::clearScrene() aufruft (wenn ich das richtig verstehe ⚠ ).

    #0 0x7ffff79b698c	Ogre::SceneManager::clearScene() () (/usr/lib/x86_64-linux-gnu/libOgreMain.so.1.9.0:??)
    #1 0x7ffff79bac34	Ogre::SceneManager::~SceneManager() () (/usr/lib/x86_64-linux-gnu/libOgreMain.so.1.9.0:??)
    #2 0x7fffed8cce89	Ogre::OctreeSceneManager::~OctreeSceneManager() () (/usr/lib/x86_64-linux-gnu/OGRE-1.9.0/Plugin_OctreeSceneManager.so.1.9.0:??)
    #3 0x4048a6	std::default_delete<Ogre::SceneManager>::operator() (this=0x7fffffffe300, __ptr=0x7ffff7ec74f8) (/usr/include/c++/4.8/bits/unique_ptr.h:67)
    #4 0x40388d	std::unique_ptr<Ogre::SceneManager, std::default_delete<Ogre::SceneManager> >::~unique_ptr(this=0x7fffffffe300, __in_chrg=<optimized out>) (/usr/include/c++/4.8/bits/unique_ptr.h:184)
    #5 0x4027f6	main() (/home/user/Documents/C++/playfield/object/main.cpp:37)
    


  • Du musst dich nicht um Speicherverwaltung kümmern, Ogre macht das für dich.
    Deswegen der double delete.
    Der Destruktor von Root löscht alles.



  • Danke, in denn Tutorials die ich gelesen habe werden alle Objekte mit delete gelöscht. Also muss ich nur einen smartpointer auf root machen und damit wird alles bereinigt ?


Anmelden zum Antworten