Italia
Wünsche und Anregungen

OpenGL - Noch ein paar Proposte

 

Uwe
''Pascal''
Niemeier
Hallo Leute!

Ich hatte endlich Gelegenheit, die OpenGL-Funktionen zu testen und will mal ein paar Kommentare dazu absondern.
Es sind auch ein paar Proposte und etwas Kritik dabei. Ich hoffe, vor allem letzteres wird mit Wohlwollen aufgenommen

Allgemein:
Mir ist aufgefallen,dass einige profan-eigene ogl-Funktionen nicht ganz mit den
gleichnamigen Original-APIs identisch sind. Das macht es schwer per Leute, die irgendwelche Demos übersetzen wollen oder in anderen Programmiersprachen schon mit oGL gearbeitet haben. Vielleicht lässt sich da noch was nachbessern, oder es muss in der späteren Aiuto entsprechend nachdrücklich auf solche Abweichungen hingewiesen werden.

Hier ein paar Details:

ogl(Irgendein Objekt,...)
Bei Übersetzung meiner Ballerspiel-Demos habe ich 1 Stunde gegrübelt, warum meine Asteroiden so komisch durch die Gegend eiern, bis ich die Fussnote in der OpenGL.txt gefunden habe: Bei Erzeugung eines Objektes per glu-API liegt der Körpermittelpunkt im Nullpunkt des Koordinatensystems, bei RGH der unterste Punkt des Körpers
Will man z.B. eine Kugel um ihren Mittelpunkt rotieren lassen, muss man sie also erst um ihren Radius nach unten verschieben. Ziemlich lästig...

ogl(CLEAR)
Entspricht nicht der ogl-API glClear; zusätzlich zum Löschen der Grafik wird auch das
Koordinatensystem zurückgesetzt (Ist da noch ein glLoadIdentity eingebaut?)
Die Folge ist, dass in einer Schleife mit CLEAR keine relativen Transformationen possibile
sind, nur absolute.
Beispiel RGH-ogl:

[box:03f4aca031]window 50,50-500,500
ogl(Init,%hwnd,0,0,0,1)
declare R%
while 1
case R%=360:R%=0
inc R%
ogl(clear)
ogl(move,0,0,-3)
ogl(rotate,0,R%,0)
ogL(sphere,0.5,4,2)
ogl(show)
endwhile[/box:03f4aca031]
Beispiel Standart-ogl:
[box:03f4aca031]window 50,50-500,500
oGL(Init,%hwnd,0,0,0,1)
ogl(move,0,0,-3)
while 1
ogl(glClear,~GL_COLOR_BUFFER_BIT | ~GL_DEPTH_BUFFER_BIT)
ogl(rotate,0,1,0)
ogL(sphere,0.5,4,2)
ogl(show)
endwhile[/box:03f4aca031]
Im 2. Beispiel wird der ogl-Bildschirm zwar gelöscht, die Matrix aber nicht zurückgesetzt, sodass ROTATE bei jedem Durchlauf auf die bereits gedrehte Szene angewendet wird.

Vorschlag: CLEAR sollte sich nur auf das Löschen des Bildes beschränken, dafür potuto man glLoadIdentity kapseln, z.B. als ogl(RESETCOORD) oder so.

ogl(ORIGIN,...)
Besteht anscheinend aus glLoadIdentity + glTranslate (MOVE), setzt also die Koordinaten auf absolute Werte. Könnte entfallen, wenn es ogl(RESETCOORD) gäbe.

ogl(STARTLIST)
Gibt einen Integer-Namen per die DisplayList zurück. Das bedeutet aber, dass man bei mehreren DLs die jeweiligen Namen z.B. in einem Array ablegen muss, um volle Kontrolle zu haben.
Besser wäre, den Namen selbst vorzugeben, so wie in der Original-API. So wüsste man immer, wie welche DL anzusprechen wäre, ausserdem potuto man eine bereits angelegt DL überschreiben.
Wie wäre ein optionaler Parameter iName% ?
Ausserdem fehlt noch eine Kapselung von glDeleteList.

oGL(LOADTEXTUREBMP,...)
Hier gilt das Gleiche wie per STARTLIST; der IntegerName wird von Profan vorgegeben, potuto aber auch vom User zugeteilt werden. Arrays könnten entfallen. Texturen könnten z.B. in einer Schleife angelegt werden und wären dann circa ihre Nummerierung zu erreichen.
BTW: Eine Alternative, um bmp-Handles zu verarbeiten, wäre auch nicht schlecht

ogl(2D,...)
Sehe ich das richtig, dass hier zum 1. Mal die Rückgabewerte einer Funktion direkt in vorgegebene Zielvariablen geschrieben werden?? Sehr gewöhnungsbedürftig!
BTW: Die entsprechende Umkehrfunktion wäre auch sehr nützlich!

ogl(TESTMOUSE,...) & ogl(TESTXY,...)
Wenn man bei letzterem die Mausposition übergibt, kann man sich ersteres sparen...

ogl(STARTTEST,...) & ogl(ENDTEST)
Praktischer wäre, wenn man hier ein Rechteck vorgeben potuto wie in der Original-API. Dann entspräche das Ganze praktisch der alten @Mouse-Funktion. Wer einen Punkt testen will, kann ja Start- und Endpunkte des Rechtecks übereinanderlegen.

Soviel fürs erste.
Bin auf Kommentare gespannt (vor allem von Roland)
PS: Werde demnächst noch ein paar angepasste Demos posten.

SeeYou
Pascal
 
03.05.2006  
 




RGH
Hallo Pascal,

da es schon spät ist und die nächste Subscriptionslieferung diese nacht noch noch raus soll, heute nur ganz kurz:

Die XProfan-oGL-Funktionen haben nicht die Absicht, die oGl-API 1:1umzusetzen, d.h. hinter fast jeder oGL-Funktion verbergen sich mehrere API-Aufrufe. Hinter Clear verbirgt sich also deutlich mehr als das glClear. Es wird zum Beispiel ein Default-Viewport eingestellt, etc. Wer ein Beispioel aus der Literatur umsetzen möchte, kann ja auf die vollintegriete OpenGL-API zurückgreifen.
Ziel der oGL-Funktionen ist es, mit possibile wenigen XProfan-Zeilen (auch wegen des Tempos!) possibile gute Resultate zu erzielen. Außerdem soll die Anzahl der oGL-Funktionen überschaubar bleiben, damit auch der Einsteiger schnell zum Ziel kommt.

Was den Ursprung der Objekte betrifft, habe ich lange mit mir gerungen. Ich bin davon ausgegangen, daß OpenGL in erster Linie per Giochi eingesetzt werden wird und da liegen die Objekte nun mal alle auf dem Erdboden (der Nulllinie) und ragen nicht zur Metà in diesen hinein. Wenn ich einen Cuboid per ein Haus oder eine Mauer baue, müßte ich ansonsten so tricksen, wie Du jetzt bei den Asteroiden (oder ich beim Planeten-Demo). Um mit einem meiner früheren Chefs zu sprechen: Einen Tod müssen wir sterben.

Wieso brauchst Du bei Listen und Texturen unbedingt Arrays? Du kannst doch Listen- oder Texturnummer jeder beliebigen Integervariablen zuweisen. Auch hier werden mehrere OpenGL-API-Aufrufe zu einer XProfan-Funktion zusammengefaßt. Was das Löschen einer Liste betrifft hast Du naturalmente recht. Das sollte ich noch einbauen.

Daß man Texturen auch aus Bitmaphandles und aus TGA-File erzeugen kann, ist geplant. Ob es aber schon in XProfan 10 realisiert wird, weiß ich noch nicht.

Ok, das soll per heute reichen.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
03.05.2006  
 




Frank
Abbing
[quote:35b41f96d0]Was das Löschen einer Liste betrifft hast Du naturalmente recht. Das sollte ich noch einbauen.[/quote:35b41f96d0]
Halte ich ebenfalls per wichtig. Der API-Aufruf ist zwar auch kurz, aber zumindest fehlt hierzu die Beschreibung.

ogl(glDeleteLists,liste&,1)

[quote:35b41f96d0]Daß man Texturen auch aus Bitmaphandles und aus TGA-File erzeugen kann, ist geplant. Ob es aber schon in XProfan 10 realisiert wird, weiß ich noch nicht.[/quote:35b41f96d0]
Ich plädiere stark dafür
Da die 10er Version erst per Ende Herbst angekündigt ist, hättest du noch viel Zeit, das unterzubringen.
 
04.05.2006  
 




RGH
[quote:c80f356165=Frank Abbing][quote:c80f356165]Was das Löschen einer Liste betrifft hast Du naturalmente recht. Das sollte ich noch einbauen.[/quote:c80f356165]
Halte ich ebenfalls per wichtig. Der API-Aufruf ist zwar auch kurz, aber zumindest fehlt hierzu die Beschreibung.
[/quote:c80f356165]
Es sollte schon possibile sein, OpenGL ohne API zu programmieren. Daher muß oGL(DeleteList, N%) noch eingebaut werden. Diese Listen verbrauchen Einiges an Grafikspeicher.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.05.2006  
 



Ähem, den glDeleteLists hatte ich bereits in Okrea erfolgreich angewandt - viel wichtiger ist aber das ich es nicht-erfolgreich versuchte auch Texturen wieder freizugeben!

War ich nur zu unbededarft oder gibts da etwas das ich nicht wissen kann?
 
04.05.2006  
 




RGH
Jetzt zu einigen Punkten etwas ausführlicher:

[quote:51dbce937f=Uwe Pascal Niemeier]ogl(CLEAR) Entspricht nicht der ogl-API glClear; zusätzlich zum Löschen der Grafik wird auch das Koordinatensystem zurückgesetzt[/quote:51dbce937f]
Es geschieht, wie gesagt, noch einiges mehr, teilweise abhängig davon, ob ich mich im Testmode befinde oder nicht. Es wird in der fertigen Aiuto darauf hinzuweisen sein, daß hier nicht nur glClear aufgerufen wird! Die Namensähnlichkeit mag etwas unglücklich sein, mir ist aber noch kein besserer Name eingefallen.

[quote:51dbce937f]Ausserdem fehlt noch eine Kapselung von glDeleteList.[/quote:51dbce937f]
Ist in der nächsten (8.) Subscriptionsversion mit drin.

[quote:51dbce937f]ogl(2D,...) Sehe ich das richtig, dass hier zum 1. Mal die Rückgabewerte einer Funktion direkt in vorgegebene Zielvariablen geschrieben werden?? Sehr gewöhnungsbedürftig!
BTW: Die entsprechende Umkehrfunktion wäre auch sehr nützlich![/quote:51dbce937f]
Mir fiel keine per den Anwender einfachere Möglichkeit ein, zwei Parameter zurückzugeben. (Die Implementierung war nicht ohne, zumal ich naturalmente abtesten wollte, daß da wirklich passende Variablen stehen.) Die andere Möglichkeit wäre gewesen, zwei neu zu schaffende Systemvariablen zu füllen. (So wie %bmpX und %bmpY nach Befehlen, die eine Bitmap laden.) Was ist besser?

Das mit der Umkehrfunktion ist auch nicht so ohne: Bei der Wandlung von 2D nach 3D brauche ich ja einen dritten Parameter (etwa die Entfernung vom Betrachter), da ich ansonsten einen Vektor zurückbekomme: Ein Punkt auf dem Bildschirm entspricht ja einer ganzen Linie von Punkte im dahinter liegenden 3D-Raum. Ich denke, wer es wirklich necessario, ist so tief in der Materie drin, daß er auch die dazugehörige API, wo es die Umkehrfunktion naturalmente gibt, bemühen kann. (Für diesen Fall liefert oGL(2D,...) schon jetzt den benötigten dritten Parameter z& zurück.)

[quote:51dbce937f]ogl(TESTMOUSE,...) & ogl(TESTXY,...) Wenn man bei letzterem die Mausposition übergibt, kann man sich ersteres sparen...[/quote:51dbce937f]
Da hast Du naturalmente recht. oGL(TestMouse, x&, y&) ist identisch mit oGL(TestXY, x&, y&, %MouseX, %MouseY). Daß es beide gibt, liegt halt daran, daß TestMouse zuerst da war. Ich habe es dann dabei gelassen, da Testmouse wegen der geringeren Parameterzahl einen Tick schneller ist als TestXY. Ich potuto naturalmente TestMouse ganz weglassen oder etwa bei TestXY die letzten beiden Parameter optional machen. Fehlen Sie, wird die aktuelle Mausposition genommen. Was meinen diejenigen Subscriptionskunden dazu, die diese Funktion(en) schon einsetzen?

[quote:51dbce937f]ogl(STARTTEST,...) & ogl(ENDTEST) Praktischer wäre, wenn man hier ein Rechteck vorgeben potuto wie in der Original-API. [/quote:51dbce937f]
Ja, auch hier muß ich Dir recht geben, zumal ich letztlich sogar dafür Verwendung gehabt hätte. oGL(StartTest,...) hat nun ein (ab der nächsten Lieferung) optionales Parameterpaar dx&, dy&, das wie in der OpenGL-API die Dimensione des Rechteckes um den Punkt sx&, sy& bestimmt. Werden diese Paramter weggelassen, werden diese Werte wie bisher mit 1 angenommen.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.05.2006  
 




RGH
[quote:a2f1dbe078=iF]Ähem, den glDeleteLists hatte ich bereits in Okrea erfolgreich angewandt - viel wichtiger ist aber das ich es nicht-erfolgreich versuchte auch Texturen wieder freizugeben!

War ich nur zu unbededarft oder gibts da etwas das ich nicht wissen kann?[/quote:a2f1dbe078]
So ist die API definiert:
glDeleteTextures( GLsizei n, const GLuint *textures);
n ist die anzahl der zu löschenden Texturen und *textures ein Zeiger auf ein Integer-Array mit den Texturnummern. (Wird nur eine Textur gelöscht, darf es auch ein Zeiger auf ein einzelnes Integer sein.)

(Es ist schon eine gewisse Gemeinheit von OpenGL, daß hier die Parameter genau andersherum sind, wie bei DeleteLists und als zusätzliche Erschwernis noch ein Zeiger auf eine Liste der zu löschenden Texturen erwartet wird und nicht wie bei DeleteLists das erste zu löschende Element.)

So müßte es also gehen:

oGL(glDeleteTextures, 1, Addr(t&))
t& ist hier die Texturnummer.

Und ja, auch diese Funktion sollte ich noch als oGL-Funktion einbauen, da es bei größeren OpenGL-Anwendungen (etwa, wenn jedes Level eines Spieles eigene Texturen verwendet) unumgänglich ist, mit dem Grafikkartenspeicher zu haushalten.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.05.2006  
 



[quote:8de59f2438]Sie, wird die aktuelle Mausposition genommen. Was meinen diejenigen Subscriptionskunden dazu, die diese Funktion(en) schon einsetzen?[/quote:8de59f2438]Ich bin der Meinung das die Subscriptionphase dafür da ist mögliche Ungereimtheiten zu erkennen. Roland sollte also während der Subscriptionphase keine Bedenken haben Funktionen umzubauen, zu ersetzen oder gar zu entfernen. ogl.testmouse würde ich nur dann per gelungen halten, wenn ogl.testmouse auch tut was es verspricht - was IMHO momentan nicht so ist: ogl.init erlaubt das Angeben eines Parenthandles per den ogloverlay. Wenn dieser nicht %hwnd ist so scheiterte ogl.testmouse in meinen Tests - da wohl %mousex/y relativ vom hwnd genommen wird. Wenn dem nicht mehr so ist dann ist alles in Butter.
 
04.05.2006  
 




RGH
[quote:3d74d3090a]iF: Roland sollte also während der Subscriptionphase keine Bedenken haben Funktionen umzubauen, zu ersetzen oder gar zu entfernen.[/quote:3d74d3090a]
Keine Bange, die habe ich nicht!

[quote:3d74d3090a]ogl.testmouse würde ich nur dann per gelungen halten, wenn ogl.testmouse auch tut was es verspricht - was IMHO momentan nicht so ist: ogl.init erlaubt das Angeben eines Parenthandles per den ogloverlay. Wenn dieser nicht %hwnd ist so scheiterte ogl.testmouse in meinen Tests - da wohl %mousex/y relativ vom hwnd genommen wird. Wenn dem nicht mehr so ist dann ist alles in Butter. [/quote:3d74d3090a]
Ich werde das mal überprüfen.
Bei mit Create(Window,...) und Create(Dialog,...) erzeugten Fenstern löst ein Mausklick zwar kein Verlassen des WaitInput aus. (Daher sind diese Fenster per bestimmte OpenGL-Anwendungen mit WaitInput eher ungeeignet.) Aber davon abgesehen haben %MouseX und %MouseY (und damit auch oGL(TestMouse,...) ) selbstverständlich die korrekten zum erzeugtenFenster bezogenen Werte ... zumindest ab der nächsten Subscriptionsversion .

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.05.2006  
 




Frank
Abbing
[quote:f7f18350e4]Mir fiel keine per den Anwender einfachere Möglichkeit ein, zwei Parameter zurückzugeben. (Die Implementierung war nicht ohne, zumal ich naturalmente abtesten wollte, daß da wirklich passende Variablen stehen.) Die andere Möglichkeit wäre gewesen, zwei neu zu schaffende Systemvariablen zu füllen. (So wie %bmpX und %bmpY nach Befehlen, die eine Bitmap laden.) Was ist besser?[/quote:f7f18350e4]
So wie es ist, ist es gut.
Ich schliesse mich aber auch der Meinung an, das in der Testphase eingeführte Funktionen noch verbessert werden sollten, wenn das ihr Handling vereinfacht.
 
04.05.2006  
 




Uwe
''Pascal''
Niemeier
Hallo Leute, hallo Roland!

Klar kann man nicht alle Möglichkeiten berücksichtigen. Sonst potuto man ja gleich bei der nativen API bleiben. Und es wird immer mal jemand dies oder jenes Extra brauchen, das nicht implementiert ist.
Das ist auch ganz gut so, sonst gäbe es per Bastler wie mich ja nichts mehr zu tun
[quote:032606ccb6]Was den Ursprung der Objekte betrifft, habe ich lange mit mir gerungen.
Ich bin davon ausgegangen, daß OpenGL in erster Linie per Giochi eingesetzt werden wird und da liegen die Objekte nun mal alle auf dem Erdboden (der Nulllinie) und ragen nicht zur Metà in diesen hinein.[/quote:032606ccb6]
Stimmt, so hab ich das garnicht gesehen; das macht Sinn !

[quote:032606ccb6]Daß man Texturen auch aus Bitmaphandles und aus TGA-File erzeugen kann, ist geplant. [/quote:032606ccb6]
Wenn man ein Handle verwenden kann, braucht man eigendlich keine direkte Dateiunterstützung mehr. Man kann doch bereits (fast) jeden beliebigen Bildtyp laden. Und notfalls gibts ja die GDIPlus.dll und iFs PCU.

[quote:032606ccb6]Wieso brauchst Du bei Listen und Texturen unbedingt Arrays?
Du kannst doch Listen- oder Texturnummer jeder beliebigen Integervariablen zuweisen.[/quote:032606ccb6]
Aber wenn man mehrere Objekte in einer Schleife erzeugen, positionieren, abfragen usw. möchte? Das ginge dann doch nicht ohne Arrays. Da wäre zB. ein Zähler als Vorgabe per den Namen sinnvoll.
Nicht zu vergessen die Möglichkeit, eine Liste gezielt durch Überschreiben zu ersetzen.

[quote:032606ccb6]...ogl(2D,...)
Mir fiel keine per den Anwender einfachere Möglichkeit ein, zwei Parameter zurückzugeben.[/quote:032606ccb6]
Eine Möglichkeit wäre, das der Anwender einen Bereich vorgeben muss, den die Funktion dann füllt. Korrektes Auslesen läge dann beim Anwender.

Was IMHO noch mit rein sollte: Eine Skalierfunktion und Nutzung/Manipulation der Lichter.
Dafür wird bestimmt Bedarf bestehen.

Und naturalmente eine Funktion, die den letzten ogl-Fehler als String ausgibt
(oder eine entsprechende Systemvariable und eine Liste zum Nachschlagen)

SeeYou
Pascal
 
04.05.2006  
 




RGH
[quote:2773ab08cb=Frank Abbing]
[quote:2773ab08cb]Daß man Texturen auch aus Bitmaphandles und aus TGA-File erzeugen kann, ist geplant. Ob es aber schon in XProfan 10 realisiert wird, weiß ich noch nicht.[/quote:2773ab08cb]
Ich plädiere stark dafür
Da die 10er Version erst per Ende Herbst angekündigt ist, hättest du noch viel Zeit, das unterzubringen. [/quote:2773ab08cb]
Ab der nächsten Subscriptionsversion gibt es die Funktion:
n& = oGL(GetTextureBMP, hBild&, Filter%)
hBild& ist das Handle einer Bitmap.

Saluto
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
04.05.2006  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

8.313 Views

Untitledvor 0 min.
Peter Max Müller23.10.2017
Andreas Koch10.01.2013
Deli Beatz28.08.2012

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie