Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Mit OpenGL auf einen anderen Screen zeichnen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nitroxis



Anmeldungsdatum: 27.02.2008
Beiträge: 300
Wohnort: Irgendwo...

BeitragVerfasst am: 22.12.2009, 10:32    Titel: Mit OpenGL auf einen anderen Screen zeichnen Antworten mit Zitat

Hallo!
Ich habe ein Hauptprogramm welches einen 2D OpenGL Screen erstellt
Code:
   ScreenRes ScreenXSize, ScreenYSize, , , &H3
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity()
   glOrtho(0, ScreenXSize, ScreenYSize, 0, 0, 1)
   glMatrixMode(GL_MODELVIEW)
   glDisable(GL_DEPTH_TEST)
   glClear(GL_COLOR_BUFFER_BIT)
   glEnable(GL_BLEND)
   glEnable(GL_POINT_SMOOTH)
   glEnable(GL_LINE_SMOOTH)
   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
   glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)

Später wird dann eine DLL mit DyLibLoad und DyLibSymbol geladen. Soweit funktioniert alles.
Nur wenn ich jetzt in dieser DLL etwas mit glBegin ..... glEnd zeichne sehe ich nichts auf dem OpenGL Screen.
Ich denke es liegt wahrscheinlich daran, das die DLL nicht weiß warauf sie zeichnen soll.
Gibt es eine möglichkeit auf den Screen des Hauptprogramms zu zeichnen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 22.12.2009, 20:16    Titel: Antworten mit Zitat

du könntest deine lib so schreiben, dass sie über callbacks auf das hauptprogramm einfach selbst aus dem hauptprogramm zeichnet.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nitroxis



Anmeldungsdatum: 27.02.2008
Beiträge: 300
Wohnort: Irgendwo...

BeitragVerfasst am: 22.12.2009, 22:09    Titel: Antworten mit Zitat

Ja dann müsste ich aber alle GL Befehle "nachahmen" die ich brauche oder?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 23.12.2009, 00:12    Titel: Antworten mit Zitat

joa, delegieren halt.. oder du abstrahierst ein bisschen und bietest komplexere zeichenfunktionen an die deine lib benutzt, könnte auch gut gehen.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nitroxis



Anmeldungsdatum: 27.02.2008
Beiträge: 300
Wohnort: Irgendwo...

BeitragVerfasst am: 23.12.2009, 00:15    Titel: Antworten mit Zitat

Hmm, aber wie stelle ich das an?
Muss ich dann in meiner DLL mit #Include die Callback-Funktionen einbinden oder per Declare?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.12.2009, 00:40    Titel: Antworten mit Zitat

O_o
was willst du damit sagen? #include bindet eine quellcode-datei ein, declare deklariert funktionen. declare kann in einer datei, die per #include eingebunden wird, benutzt werden.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 23.12.2009, 01:47    Titel: Antworten mit Zitat

oop for the win ;D

du machst ne funktion in deine lib "registerCallback(funktionspointer)", und dann rufst du die aus deinem hauptprogramm auf mit dem pointer der entsprechenden zeichenfunktion als parameter. deine lib ruft dann halt immer die funktion auf deren pointer sie da erhalten hat.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nitroxis



Anmeldungsdatum: 27.02.2008
Beiträge: 300
Wohnort: Irgendwo...

BeitragVerfasst am: 23.12.2009, 13:48    Titel: Antworten mit Zitat

verwundert
Ich wollte ja soetwas wie eine Plugin-API machen...
Das Hauptprogramm erzeugt nur einen schwarzen Bildschirm und dann werden die Plugin-DLLs zur Laufzeit geladen die dann so ziehmlich alles zeichnen sollen.

Kann ich denn meiner DLL denn nicht einfach sagen das sie den OpenGL-Screen das Hauptprogramms benutzen soll?
Gibts dafür nicht eine OpenGL-Funktion?

Das mit dem registerCallback versteh ich nicht...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 72

BeitragVerfasst am: 30.12.2009, 00:34    Titel: Antworten mit Zitat

Hallo Nitroxis
das Problem liegt ganz wo anders.

Dein Hauptprogramm (Prozess) läuft in einem eigenem (virtuellem) Adressraum und erstellt den RenderContext "RC" wenn nun Deine DLL in ihrem eigenem Adressraum GL Primtieve zwischen glBegin() und glEnd() nutzt steht der RC vom Hauptprogamm noch nicht zur Verfügung.

Die Lösung ist recht einfach:

Du must den RC aus dem Hauptprogramm in der DLL zum aktuellem machen.
(das geht mit Linux und Windows nur die Befehle haben leicht abweichende Bezeichnungen)

Windows: wglMakeCurrent(dc,rc)
Wie der Name vermuten läst wird der OpenGL RenderContext rc und dessen DeviceContect dc zum aktuellem gemacht.

Du könntest nun in Deiner DLL eine sub/function haben wie InitDLL(dc as HDC,rc as WGLRC) die Dein Hauptprogramm zuerst auffruft.

Jetzt fragst Du dich vielleicht woher Du den Device- und Render- Context (dc,rc) her bekommst.

Da gibt es auch wieder zwei Befehle für:
wglGetCurrentContext() und wglGetCurrentDC()

Also im Hauptprogramm könnte das so aussehen:
Code:
Screen / ScreenRes ...
InitDll(wglGetCurrentContext(),wglGetCurrentDC()
... ' ab hier kannst Du alle OpenGL Befehle in der DLL nutzen


In der DLL etwa so:
Code:
function InitDLL(dc as HDC, rc as WGLRC) export
  wglMakeCurrent(dc,rc)
end function


Viel Spass beim Rendern

Micha
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 30.12.2009, 11:38    Titel: Antworten mit Zitat

Hallo, stell mal dein gesamtes Programm rein.
Dann könnte man mitfühlen... lächeln ...testen zwinkern

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 31.12.2009, 16:42    Titel: Antworten mit Zitat

@micha,
schöne Lösung, gut erklärt, danke!
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 72

BeitragVerfasst am: 31.12.2009, 21:30    Titel: Antworten mit Zitat

Kleiner Nachtrag:

Gerade in einem Plug-In System sollen ja dynamisch Funktionen über Libs eingebunden werden und bei Bedarf sollte man auch ein Plug-In zur Laufzeit wieder entladen können.

Zu InitDLL fehlt noch das Gegenstück zum "sauberen" entladen des Plug-Ins.

Plug-In Init
Code:
SUB InitDLL(dc AS HDC, rc AS WGLRC) EXPORT
  wglMakeCurrent(dc,rc)
END SUB
Plug-In Free
Code:
SUB FreeDLL() EXPORT
  wglMakeCurrent(NULL,NULL)
END SUB
Nach FreeDLL kann ein anderes Plug-In mit Hilfe von InitDLL den OpenGL Render Context zum aktuellem RC machen.

Micha
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz