Object-oriented Graphics Rendering Engine (OGRE) Uluslararası Bilgisayar Enstitüsü Ege Üniversitesi Ahmet Bilgili & Serkan Ergun
Ogre Kolay kullanılabilir nesne yönelimli Direct3D/OpenGL bağımsız tasarım. Otomatik render state yönetimi. Platform bağımsız (Windows, Linux, Mac OSX) Malzeme scriptleri ve HLSL, GLSL, Cg, asm shader desteği Donanım destekli İskelet ve Morph animasyonu Uyarlanabilir sahne yönetimi desteği Post-process efektler, parçacık sistemleri, stencil (şablon) ve dokusal gölgelendirme yöntemleri.
Root Root nesnesi Ogre sistemini ilklendirmek için kullanılır. Sistemin yapılandırmasını yapar. Pluginlerin başlatılması, Rendering ve Sahne yönetim sistemlerinin seçilmesi ve başlatılması işlerini üstlenir.
Sahne Yönetimi Sahnede neyin nasıl görüneceğinin tanımlandığı sınıfları içerir. SceneManager: Işık, kamera, 3D Obje gibi standart nesnelerin yaratıldığı ve sahne hiyerarşisinin sağlandığı sınıftır. MovableObject: Sahnede konumlandırılıp hareket ettirilebilen nesneleri ifade eder. SceneNode: Sahne hiyerarşisinin sağlandığı ağacın düğümlerini ifade eder. Her düğüme MovableObject nesneleri ya da konumlandırılabilen alt düğümler eklenebilir.
Kaynak Yönetimi Render işlemlerinin kaynaklara ihtiyacı vardır. Doku, 3D Model, Fontlar vs. Bu kaynakların yüklenmesi ve tekrar kullanılması işlerini yöneten sınıflar içerir
Rendering DirectX, OpenGL gibi düşük seviye API ler aracılığıyla donanımla konuşmayı sağlar
Malzeme Scriptleri Malzemelerin nasıl görüntüleneceği, ekrana hangi sırayla, kaç defa, nasıl çizileceğini belirten scriptlerdir. Malzeme scriptleri kalıtım yoluyla başka bir malzemenin özelliklerini içerebilir. Malzeme tanımı içindeki ilk uyumlu teknik (her teknik her donanımda çalışmayabilir) kullanılır Seçilen teknik içindeki her pass için nesne sahneye o pass in ayarlarını kullanarak (üst üste) çizdirilir. Her pass te bir veya daha fazla doku (animasyonlu olabilir), ışıklandırma bilgileri, kullanılan vertex ve pixel shader bilgileri tanımlıdır. materialwalls { technique // first, walls/funkywall1 preferredtechnique { pass // { firstpass texture_unit diffuse1.0 ambient0.5 // Textureunit0 unit 1.0 0.51.0 0.5 { }// wave_xform texturewibbly.jpg scroll_anim wave_anim0.1 xformscale scalesine 0.0 texture_unit Textureunit1 unit (thisis a sine0.0 multitexturepass) 0.70.01.0 { rotate_anim texturewobbly.png _anim0.25 }// } } colour_op add Secondtechnique, can be usedas { //.. andsoon a fallbackorlod level } }
Örnek Malzeme material showcolours { technique { pass { ambient vertexcolour cull_hardware none } } }
Örnek Mesh <mesh> <submeshes> <submesh material="showcolours" usesharedvertices="false" use32bitindexes="false" operationtype="point_list"> <geometry vertexcount="5"> <vertexbuffer positions="true" colours_diffuse="true"> <vertex> <position x="0" y="0" z="0" /> <colour_diffuse value="1 0 0 1" /> </vertex> <vertex> <position x="0.5" y="0" z="0" /> <colour_diffuse value="0 1 0 1" /> </vertex> <vertex> <position x="-0.5" y="0" z="0" /> <colour_diffuse value="0 0 1 1" /> </vertex> <vertex> <position x="0" y="-0.5" z="0" /> <colour_diffuse value="1 1 0 1" /> </vertex> <vertex> <position x="0" y="0.5" z="0" /> <colour_diffuse value="0 1 1 1" /> </vertex> </vertexbuffer> </geometry> </submesh> </submeshes> </mesh>
Örnek Root root; // Root nesnesi root.showconfigdialog(); // Konfigurasyon penceresini göster root.addframelistener(new CustomFrameListener()); // Pencere oluştur RenderWindow* renderwindow = root.initialise(true, "Ogre Introduction"); // Sahne Yöneticisi oluştur gscenemanager = root.createscenemanager(st_generic, "ExampleSMInstance"); // Kamera oluştur gcamera = gscenemanager->createcamera("playercam"); gcamera->setposition(vector3(0,0,5)); // kameranın konumu gcamera->lookat(0, 0, 0); // baktığı nokta gcamera->setnearclipdistance(1); // yakın düzlem uzaklığı gcamera->setfarclipdistance(100); // uzak düzlem uzaklığı gcamera->setautoaspectratio(true); // otomatik en boy oranı // Kamerayı pencere ile ilişkilendir Viewport* vp = renderwindow->addviewport(gcamera);
Örnek // Kaynak dosyaların konumları ResourceGroupManager::getSingleton().addResourceLocation("../media/","FileSystem"); ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); // Nesneleri oluştur mobjects[0] = gscenemanager->createentity("trianglefan", "trianglefan.mesh"); mobjects[1] = gscenemanager->createentity("pointlist", "pointlist.mesh"); mobjects[2] = gscenemanager->createentity("linelist", "linelist.mesh"); mobjects[3] = gscenemanager->createentity("linestrip", "linestrip.mesh"); mobjects[4] = gscenemanager->createentity("trianglelist", "trianglelist.mesh"); mobjects[5] = gscenemanager->createentity("trianglestrip", "trianglestrip.mesh"); // Nesnelerden seçili olanı sahneye ekle gscenemanager->getrootscenenode()->attachobject(mobjects[gcurrentprimitive]); // Çizim işlemine başla root.startrendering();
Teşekkürler