Deutsch
Online-Dokumentation

ogl.tutorial.initialisierung Erklärung: OpenGL

 
← zurück zur OGL-Tutorialübersicht ogl->tutorial 

[head]Einleitung[/head]
Hallo Freunde des XProfan-OpenGL,

dies ist ein Versuch der Implementierung von Tutorials in die OnlineDoku.

Die OnlineDoku ist daher besonders geeignet da Mitglieder beliebig mitmischen, korrigieren und erweitern können.

In diesem Kapitel widme ich mich lediglich der Herstellung eines OpenGL-Fensters das später zur Anzeige von Objekten dienen soll.

Hier geht es nicht darum ogl ("init"... mit seinen Parametern zu erklären.

Anfangs sollte man sich für eine Variante entscheiden:

? Erzeugung <a href='#full'>Vollbild-Gamescreen</a> wie bei redcube 
? Erzeugung <a href='#win'>Fenster-Gamescreens</a>
? Erzeugung <a href='#gdi'>Fenster mit OGL-Anzeigebereich neben GDI-Controls</a> wie z.B. bei okrea 

Trotzdem einfach mal vorab ein Minisource welcher OpenGL einfach erzeugt und einen Cuboiden zeigt:
cls
ogl("init",%hwnd,0.0,0.0,0.0,1)
ogl("clear")
ogl("origin",0,0,-10)
ogl("cuboid",1,1,1)
ogl("show")
waitinput
end

[head]>full Vollbild-Gamescreen erzeugen[/head]
Ein Vollbild-Gamescreen erzeugen ist die leichteste aller Übungen, birgt aber dennoch die Tücke wegen der Anzeigeproportionalität.

Wer es ganz einfach möchte erzeugt also zuerst ein Hauptfenster %hwnd  und initialisiert einfach darauf das OGL. Das funktioniert so:
windowstyle 80'Fenster ohne jeden Schnickschnack
window 0,0 - %maxx,%maxy'vollen Bildschirm ausfüllen
ogl("init",%hwnd,0,0,0,1)
waitinput
ogl("done")
end

Jenachdem welche Auflösung am Computer eingestellt ist wird hiernach ein gröstmögliches Fenster erzeugt und OpenGL darauf initialisiert.

Jetzt kann es aber sein das die Auflösung nicht typisch 4/3 ist - das heist - das die Y-Auflösung z.B. nicht wie bei 640x480 oder 1024x768 genau das Dreiviertel der X-Auflösung ist. Auch die neuen TFT-Bildschirme kommen gerne mit sehr unterschiedlichen Auflösungen daher - wie z.B. 1280x768 oder 1280x1024.

Das XProfanOpenGL-Anzeigefenster skaliert sich jedoch nicht unproportional was zur Folge hat das z.B. links und rechts ein schwarzer Rand entstehen kann. Wenn (%maxx /4*3)<%maxy  ist entsteht oben und unten ein Rand, andernfalls entsteht der Rand links und rechts.

Der möglicherweise entstehende Rand ist insofern problematisch da der Rand trotzdem zum Zeichnen von OpenGL verwendet wird. Das Anbringen z.B. von einem Cockpit ginge also nicht da entweder das Cockpit nicht vollständig zu sehen ist oder "unterhalb" vom Cockpit ein Rand entsteht bei dem z.B. die Strasse/Land zu sehen wäre. Der Rand muss also weg!

Bedienen wir uns also eines Tricks wenn wir die Bildschirmauflösung nicht ändern wollen. Wir gehen jetzt mal davon aus das die Y-Auflösung grösser sein kann als %maxx /4*3. Umgekehrt ists seltener der Fall - kann aber genauso vorkommen!

Wir erzeugen einfach ein zweites Fenster unterhalb von %hwnd  was den ganzen Bildschirm ausfüllt, und legen ein in der Größe angepasstes (4/3Proportional!) %hwnd  einfach darüber.
windowstyle 80'Fenster ohne jeden Schnickschnack
var bgwin&=createwindow(0,"",0,0,%maxx,%maxy)'auf Desktop ein Hintergrundfenster erzeugen
enablewindow bgwin&,0'deaktivieren wir es damit ein Klick das Fenster noch weniger tangiert
window 0,0 - maxx,maxy/4*3
setwindowpos hwnd%=0,((maxy-(maxx/4*3))/2) - maxx,maxx/4*3;-1'hwnd in Bildschirmmitte verrücken und in den Vordergrund holen.
ogl("init",%hwnd,0,0,0,1)
waitinput
ogl("done")
end

Natürlich kann man nun dem bgwin& z.B. eine Farbe verpassen. Hierzu kann man einfach startpaint  nutzen:
startpaint bgwin&
cls 0'machen wirs einfach schwarz
endpaint

Mehr dazu später...

[head]>win Fenster-Gamescreen erzeugen[/head]
Wie auch beim Vollbild-Gamescreen müssen wir auf die Proportionalität vom OGL-Anzeigebereich achten. Der innere Bereich von %hwnd  sollte also 4/3 sein.

Hierbei können wir uns folgende kleine Prozedur zunutze machen:

An diese Prozedur können wir Höhe und Breite übergeben und das %hwnd  wird auf diese Maße angepasst.

Erzeugen wir also zunächst ein Fenster und passen die Größe auf Proportionalität an:
cls'Fenster erzeugen
setinnersize width(%hwnd),(width(%hwnd)/4*3)

Hierdrauf nun den OpenGL-Anzeigebereich initialisieren:
ogl("init",%hwnd,0,0,0,1)
waitinput
ogl("done")
end

und das wars auch schon. Natürlich sollte man per windowstyle  dafür sorgen das entweder a) ein Vergrössern/Verkleinern/Skalieren des %hwnd  nicht möglich ist oder b) nach Erkennung einer Skalierung vom %hwnd  erneut setinnersize wie oben aufrufen.

Mehr dazu später...

[head]>gdi OGL-Anzeigebereich neben GDI-Controls erzeugen[/head]
Dies ist sicherlich eine der schlimmsten Aufgaben denn die Position und Größe des OGL-Anzeigebereiches können wir nicht bestimmen. Der OGL-Anzeigebereich füllt immer den kompletten Parent aus und nimmt seine Ausmaße an.

Hierbei müssen wir also den OGL-Anzeigebereich auf ein anderes Control statt auf das %hwnd  legen.

Nach viel Herumprobiererei mit okrea  kann ich von etwas Erfahrung berichten das hierzu am Besten ein Control genutzt wird was mit dieser Funktion erstellt wird:
proc createChildWindowAsStatic

    parameters h&,s$,x&,y&,xx&,yy&
    declare ws&
    h&=create("ChildWindow",h&,s$,x&,y&,xx&,yy&)'child erzeugen
    'titelbar und rahmen entfernen | setwindowlonggedöns
    ws&=GetWindowLongA(h&,-16) - $C00000 - $40000
    SetWindowLongA(h&,-16,ws&)
    return h&

endproc


Wir erzeugen also zuerst das Hauptfenster %hwnd :
cls'Fenster erzeugen
setinnersize width(%hwnd),(width(%hwnd)/4*3)

erzeugen dann unser OGL-Child:
var ogl.child&=createChildWindowAsStatic(%hwnd,".OglParent",0,0,width(%hwnd),height(%hwnd))

und initialisieren nun hierdrauf unseren OGL-Anzeigebereich:
ogl("init",ogl.child&,0,0,0,1)
waitinput
ogl("done")
end

fertig. Jetzt können wir einfach mit setwindowpos  das Control ogl.child& positionieren und damit auch unseren OGL-Anzeigebereich. Nach Positionierung von ogl.child& sollte auch immer ein ogl("Show") erfolgen da hier kein automatisches Neuzeichnen von Statten geht.

Mehr dazu später...
 
08.02.2007  
 



Hinweis/ Anmerkung/ Frage zum Hilfethema


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

794 Betrachtungen

Unbenanntvor 0 min.
Tango06.08.2021
Donnie07.04.2013

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

iF (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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