Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.12.2009, 10:32 Titel: Mit OpenGL auf einen anderen Screen zeichnen |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 22.12.2009, 20:16 Titel: |
|
|
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 |
|
 |
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 22.12.2009, 22:09 Titel: |
|
|
Ja dann müsste ich aber alle GL Befehle "nachahmen" die ich brauche oder? |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 23.12.2009, 00:12 Titel: |
|
|
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 |
|
 |
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 23.12.2009, 00:15 Titel: |
|
|
Hmm, aber wie stelle ich das an?
Muss ich dann in meiner DLL mit #Include die Callback-Funktionen einbinden oder per Declare? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.12.2009, 00:40 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 23.12.2009, 01:47 Titel: |
|
|
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 |
|
 |
Nitroxis
Anmeldungsdatum: 27.02.2008 Beiträge: 300 Wohnort: Irgendwo...
|
Verfasst am: 23.12.2009, 13:48 Titel: |
|
|
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 |
|
 |
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 30.12.2009, 00:34 Titel: |
|
|
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 |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 30.12.2009, 11:38 Titel: |
|
|
Hallo, stell mal dein gesamtes Programm rein.
Dann könnte man mitfühlen... ...testen
Gruss |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 31.12.2009, 16:42 Titel: |
|
|
@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 |
|
 |
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 31.12.2009, 21:30 Titel: |
|
|
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 |
|
 |
|