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

Aktuelle Zeit: Sa Jul 19, 2025 15:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mär 18, 2010 17:14 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Hallo alle DGLer,

Ich habe in meiner Anwendung das Problem, dass ich zwei Frames jeweils auf ein Panel werfe. (Innerhalb einer Form) Ich habe in jedem Frame eine Instanz einer Unit, die für die Darstellung der OpenGL Scene zuständig ist. Sprich, ich habe eigentlich zwei verschiedene RCs, bzw. DCs. Nun dachte ich, dies sollte OpenGL handeln können und beide unabhängig voneinander darstellen. Aber nix da, der Frame auf den Ich zuletzt zeichne, sprich bei dem als letztes die Instanz der RenderUnit erzeugt wird, wird auch nur dargestellt. Ich möchte zwischen den Render Contexten wechseln können und nicht über Viewport oder Scissor gehen, da ich diese Frames unabhängig voneinander laufen lassen und den RC bei dem einen auch mal deaktivieren bzw. aktivieren möchte.

Ich habe schon diesen Renderswitching Thread gelesen, nur wird dort zum grossen Teil von GLViewPort geprochen. Dies wäre auch dahingehend interessant, wenn man den selben Frame in einer weiteren Form(Dialog) aufmacht, welche bei Buttonclick aktiviert wird und diese zum selben Zeitpunkt zeichnet, wie der Frame auf der Form zuvor.

Vielleicht hat jemand von Euch eine Idee. Ich habe dieses Problem seit Beginn meiner OGL-Laufbahn (naja, noch nicht so lange) und immer wieder muss ich bei dem Thema passen.
Ich habe schon gelesen, dass es ein wglcurrentDC gibt, kann aber nicht wirklich viel damit anfangen.

Mit besten Grüssen,

Heavenssake007


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 18, 2010 17:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Vom Prinzip her kannst du dir mal dieses Beispiel anschauen, welches aber noch die OpenGL12.pas verwendet, was nicht zu empfehlen ist! Also nur das Prinzip anschauen und möglichst kein C&P machen.

Generell kannst dir mal die Funktion wglMakeCurrent anschauen, die für den Wechsel zwischen zwei Renderkontexten zuständig ist. Wenn du vor dem Zeichnen in jedem Frame entsprechend diese Funktion aufrufst, sollte das ganze schon Funktionieren.

Viel Erfolg :)

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 18, 2010 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Hinweis am Rande:
Bist du dir sicher das du wirklich zwei Kontexte möchtest? Üblicherweise will man nämlich Dinge wie Texturen in beiden Viewports gemeinsam nutzen. Ich bin Qt-Nutzer und weiß daher nur wie es dort geht: Man muss explizit angeben welche Kontexte sich die Daten teilen sollen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 19, 2010 09:16 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
@LordHorazont

Werde mir das mit dem wglMakeCurrent gleich mal anschauen. Das war auch der wgl-Befehl, den ich ursprünglich oben gemeint hatte. Muss jetzt mal damit rumexperimentieren.

@Coolcat

Ich gehe schon davon aus, dass ich den Rendercontext wechseln muss, da ich ja nicht in derselben Form arbeite, aber den Rendercontext des einen Frames doch aufrecht erhalten möchte, wenn ich den anderen öffnen will. Oder sehe ich das falsch. Zuvor habe ich das immer so, gemacht, dass ich sämtliche Variablen, wie Rotation,Zoom, FigurenVertices, etc. sichere wenn ich die zweite Form öffne, den Rendercontext des Frames freigebe und anschliessend, wenn ich die Form wieder schliesse, erstelle ich einen neuen Rendercontext und setze die Parameter neu. Das war nun der Grund warum ich zwischen den Rendercontexten switchen möchte.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 19, 2010 10:57 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
@Lord Horazont

Also ich hab das jetzt mal mit dem wglCreateContext gemacht und irgendwie bekomme ich genau an der Stelle einen AdressFehler. Bei mir sieht das so aus:

Code:
constructor TOpengLFigure.Create(Handle: HWND; Height,
  Width : integer);
var
   //gl2
   PixelFormatDescriptor : TPixelFormatDescriptor;
   PixelFormat           : GLInt;
   gl2Context            : HGLRC;

begin
   DC := GetDC(FHandle);

   // initialisiere pixelformat structure
   FillChar(PixelFormatDescriptor, SizeOf(PixelFormatDescriptor),0);
   with PixelFormatDescriptor do begin
      nSize       := SizeOf(PixelFormatDescriptor);
      nVersion    := 1;
      dwFlags     := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER;
      iPixelType  := PFD_TYPE_RGBA;
      cColorBits  := 32;
      cDepthBits  := 24;
   end;

   // choose pixelformat
   Pixelformat := ChoosePixelFormat(DC,@PixelFormatDescriptor);
   if PixelFormat = 0 then
      RaiseLastOSError;

   //set pixelformat
   If not SetPixelFormat(DC,PixelFormat,@PixelFormatDescriptor) then
      RaiseLastOSError;

   //rendercontext erstellen
   RC := wglCreateContext(DC); //hier läuft was schief

   //aktivieren des Contextes
   wglMakeCurrent(dc, rc);
end;



Ich hab mal den Treiber geupdated, da ich dachte, dass das vielleicht das Problem löst. Aber nix da...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mär 19, 2010 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich schätze mal, InitOpenGL wird irgendwo einmal aufgerufen?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 22, 2010 09:19 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
Oh man, jein. Das war das Problem. Danke!!! :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 22, 2010 09:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst auch mindestens einmal ActivateRenderingContext der dglOpenGL aufrufen. Bzw. alternativ die Methoden ReadImplementationProperties und ReadExtensions.

Denn diese Methoden laden die Funktionspointer von OpenGL. Ohne diese Methoden kannst du deine Anwendung zwar übersetzen und starten. Aber solltest tatsächlich versuchen irgendwas zu zeichnen, wird es dort wieder Fehler geben, da die Funktionspointer nicht geladen wurden.

Du kannst das Erstellen des Rendercontextes im übrigen auch mit der dglOpenGL erledigen. Du müsstest da bei CreateRenderingContext eben nur einen anderen DC übergeben. Wobei es nie schaden kann zu wissen was da wirklich passiert.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 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.016s | 17 Queries | GZIP : On ]