Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 22:06

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Crossplatform OpenGL/D3D
BeitragVerfasst: Mo Dez 08, 2008 08:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

weiß jemand von euch wie die ganzen Spiele entwickler das angehen wenn sie ein Spiel für sowohl OpenGL als auch D3D entwickeln?
Ich meine, klar.. man kann den code insofern abstrahieren das man alles in klassen abkapselt was die API selbst betrifft und dann einfach die klassen austauscht..

aber:

1) Wie schaut es aus mit wirklich API spezifischen dingen.. auch wenn mir da grad so spontan nichts einfällt (dafür kenne ich D3D zuwenig), aber es gibt doch sicher dinge die sich nicht so einfach gleich machen lassen beiden beiden APIs oder? Also so, dass man nicht beides unbedingt einfach in die gleiche klasse abstrahieren kann...

2) Wie schaut es aus mit Shadern? Gibt es da nen weg eine kompatibilität zwischen GLSL und HLSL zu schaffen? Oder muß man die halt 2x schreiben..?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 08, 2008 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
for gl3ds i made an attempt for render targets. http://www.noeska.net/downloads/gl3ds_r ... alpha1.zip
i made a generic baseclass in render and an inherited implementation for opengl in glrender and have done the same for the other classes.

the problem with supporting both opengl and d3d is the coord systems are different, on top of that you need to support shaders for both d3d and opengl.

ati is suposed to have a conversion tool for converting hlsl to glsl. (http://sourceforge.net/projects/hlsl2glsl)

why not also use opengl under windows?

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 09, 2008 02:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Schreibt man auf unterschiedlichen Bibliotheken, dann gibt es natürlich Funktionen und Features, die nicht beide gleichermaßen können und darum hat man ja abstrakte Klassen. Diese legen den gemeinsamme größte Menge fest und alles ausserhalb wird entweder fixed im Gamecode hinzugepackt(ifdef,else,endif) oder garnicht benutzt.
Der erste Fall tritt extrem selten auf, wenn überhaupt und das liegt daran, dass du momentan von der falschen Seite herran gehst.
Du hast am Ende ein Spieler, dieser ist eine Klasse(TPlayer) und diese enthält Variablen zu Klasse(TKI,TModel), welche wieder Klassen besitzen(TMesh, TMaterial, TPathfinding, TBehavior, TStateMachine, ...).
Deine TMesh Klasse kann dann z.B. von einem Grafik Kontext erstellt werden(TMeshOpenGL, TMeshD3D, TMeshOpenVL, TMeshOpenCL,...) und über TMesh wird es modifiziert. Dein Mesh wird von TModel entsprechend verwendet und diese Methoden werden in der jeweiligen Bibliothek realisiert und dabei versucht man es so um zu setzen, dass es möglichst schnell und soviel Hardware wie möglich supported. Du kannst also in deiner TMeshOpenGL Version Immediate verwenden und in TMeshOpenGL30 VBO, um dein Mesh zu realisieren. Innerhalb der Klasse kannst auch defines benutzen und z.B. bei bestimmten CPUs, Binary Architektur andere Implementierungen verwenden aber das passiert innerhalb der Klasse und ist nach aussen nicht bemerkbar.
Generiere und verwalte deine Ressourcen über Manager.
Der Manager für Grafik sachen wäre dann z.B. ein TGraphicContext welcher TGraphicContextClassOpenGL oder TGraphicContextClassD3D ableitet.
Damit werden alle Ressourcen automatisch für die korrekten Bibliothek verwendet und man kann ganz einfach an einer Stelle die verwendete Bibliothek fest legen.
Code:
  1. myWnd=new TWindow;
  2. switch(Settings.GetUsedGraphicLib())
  3. {
  4.   case GL_OPENGL:myWnd.SetGraphicContext(new TGraphicContextClassOpenGL); break;
  5.   case GL_D3D:myWnd.SetGraphicContext(new TGraphicContextClassD3D); break;
  6.   case GL_PS3:myWnd.SetGraphicContext(new TGraphicContextClassPS3); break;
  7.   case GL_WII:myWnd.SetGraphicContext(new TGraphicContextClassWII); break;
  8.   case GL_PSP:myWnd.SetGraphicContext(new TGraphicContextClassPSP); break;
  9.   case GL_XBOX360:myWnd.SetGraphicContext(new TGraphicContextClassXBOX360); break;
  10. }
  11. myWnd.GetGraphicContext().GenerateMesh("Dog").LoadFromURI("vfs://media/models/dog.bla");
  12. ...
  13. TMesh* Mesh=myWnd.GetGraphicContext().GetMesh("Dog");
  14. Mesh->Update(TTimer::GetDelta());
  15. Mesh->Draw();


Zum Thema Shader gibt es 2 Wege.
Der erste Weg ist der klassische alte Weg über mehrere Shader für die jeweilige Grafikkarte und Bibliothek und die moderne Variante sind Bibliotheken wie CG, welche eine neue Scriptsprache in die entsprechenden Shader für eine Bibliothek konvertieren und dann in der Bibliothek compilieren.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 09, 2008 12:15 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
Meine 2D-Engine kann auch sowohl OpenGL als auch Direct3D verwenden. Den kompletten Sourcecode gibt es hier:

http://andorra.cvs.sourceforge.net/view ... dorra/src/

Im Prinzip habe ich eine Abstraktionsebene für die Grafikschnittstelle geschrieben und lade die entsprechende Implementierung über ein Plugin herein. Bei der Entwicklung der Abstraktionsebene bin ich zunächst von Direct3D ausgegangen und habe erst nachdem die Schnittstelle fertig war OpenGL implementiert. Ich bin auf keine Probleme gestoßen. Du musst die API so weit herunterbrechen, dass du auf keine spezifischen Features stößt.
Zum Beispiel kann Direct3D direkt Texturen aus JPEG, PNG, DDS etc. Dateien laden. Diese Funktion sollte nicht in deine Schnittstelle, da sie zu spezifisch ist. Trotzdem gäbe es kein Problem, selbst wenn diese Funktion vorhanden wäre: Dann musst du die Ladefunktionen für OpenGL halt extra schreiben.

Bei Shadern setze ich auf folgenden weg:
Die Grafikplugins stellen ein abstraktes Shaderinterface bereit, das zurückgibt, ob eine bestimmte Sprache unterstützt ist. HLSL Shader werden von Direct3D, Cg von Direct3D und OpenGL, GLSL Shader nur von OpenGL unterstützt.

Interessante Dateien in meiner Engine:
Schnittstellendefinition: http://andorra.cvs.sourceforge.net/view ... iew=markup
Shaderschnittstellendefiniton: http://andorra.cvs.sourceforge.net/view ... iew=markup

OpenGL-Implementierung: http://andorra.cvs.sourceforge.net/view ... iew=markup
Direct3D-Implementierung: http://andorra.cvs.sourceforge.net/view ... iew=markup

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]