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

Aktuelle Zeit: Fr Jul 18, 2025 15:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Apr 15, 2006 17:13 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

ich hab hier ein Programm das 2 Renderkontexte benutzt:

Hier die Initialisierung:
Code:
  1.  
  2. DC := GetDC(panel1.Handle);
  3. DC2 := GetDC(panel2.Handle);
  4.  
  5. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  6. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  7. RC2 := CreateRenderingContext(DC2, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  8.  
  9. // Erstellten Renderkontext aktivieren
  10. ActivateRenderingContext(DC2, RC2);
  11. ActivateRenderingContext(DC, RC);
  12.  


Hier mein onIdle Ereignis:

Code:
  1.  
  2. wglMakeCurrent(DC2,RC2);
  3.   glDisable(GL_DEPTH_TEST);
  4.   glMatrixMode(GL_PROJECTION);
  5.   glPushMatrix();
  6.   glLoadIdentity();
  7.   glOrtho(0, form1.panel2.ClientWidth, 0 , form1.panel2.ClientHeight , 0, 128);
  8.   glMatrixMode(GL_MODELVIEW);
  9. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  10.  
  11. // ZeichenCode
  12.  
  13. SwapBuffers(DC2);
  14.  
  15.  
  16. wglMakeCurrent(DC,RC);
  17.  
  18.   glDisable(GL_DEPTH_TEST);
  19.   glMatrixMode(GL_PROJECTION);
  20.   glPushMatrix();
  21.   glLoadIdentity();
  22.   glOrtho(0, form1.panel1.ClientWidth, 0 , form1.panel1.ClientHeight , 0, 128);
  23.   glMatrixMode(GL_MODELVIEW);
  24.  
  25. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  26.  
  27. // ZeichenCode
  28.  
  29. SwapBuffers(DC);
  30.  


Das funktioniert leider nur für den ersten Renderkontext, also der der hier als 2. abgearbeitet wird. Der zweite Kontext bleibt komplett schwarz. Nun das Seltsame: Sobald ich bei der Aktivierung des OrthoModuses des zweiten Kontextes statt

Code:
  1.  
  2. glOrtho(0, form1.panel2.ClientWidth, 0 , form1.panel2.ClientHeight , 0, 128);
  3.  


folgendes schreibe:

Code:
  1.  
  2. glOrtho(0, form1.panel1.ClientWidth, 0 , form1.panel1.ClientHeight , 0, 128);
  3.  


also beide Dimensionen auf Panel1 ausrichte, dann wird wenigstens das gezeichnet was gezeichnet werden soll. Leider aber total verzerrt, was logischweise daran liegt das Panel1 nicht die Selbe Größe hat wie Panel2.

Woran liegt das :?:

Ich hoffe ihr könnt mir helfen ;)

Danke + Grüße
Passi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 16, 2006 21:59 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Hört sich für mich sehr bizarr an. Probiere bitte einmal sämtliche von Dir genutzten Funktionen beim Zeichnen in den exakt gewünschten Modus zu bringen. Ist der Tiefenbuffer vorm rendern stets deaktiviert? Wird der Viewport bzw. die Perspektive stets richtig ausgerichtet und nicht durch eine andere Veränderung der Projektionsmatrix verändert? Rufe zur Sicherheit hinterm setzen der Modelview ebenfalls nochmals ein glloadidentity. Schlägt dies ebenfalls fehl, lade sonst noch einmal den Source Code für einen Windows-Nutzer hier hoch. Vielleicht kann dieser das Problem dann erkennen. Ich tippe allerdings sehr stark darauf, dass ein State an einer Stelle nicht dem erwarteten werd entspricht. (sofern man einen alten, amoklaufenden Treiber ausschließt *g). Von dem Voodoo (Dimension von Panel1, statt Panel2) solltest Du Dich entfernen. Um hier seinen Spass zu haben, muss man schon ziemlich viel im Programm machen und einen Pointer verbogen haben - however: Selbst dann hilft Voodoo nicht weiter, sondern verwirrt nur. Also in jedem Fall also so setzen, wie Du es gerne möchtest und dann der Fehlersuche eine Chance geben.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: mein Vorschlag...
BeitragVerfasst: Sa Apr 29, 2006 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Ich habe eine Anwendung entwickelt, die beliebig viele Fenster öffnen kann. Jedes dieser Fenster dient als Anzeigebereich für eine OpenGL Szene. Das klappt auch wunderbar. Ich habe mal als Test 30 Fenster geöffnet und in jedem Fenster eine Szene sich drehen lassen.

Hier mein vorgehen (auszugsweise aus meiner Form-Komponente):

Code:
  1.  
  2. // OpenGL Initialisierung wird im Hauptformular durchgeführt
  3.  
  4.     prxNear: GLdouble;        // wert für gluPerspective
  5.     prxFar: GLdouble;         //            "
  6.     prxFovy: GLdouble;        //            "
  7.     prxAspect: GLdouble;
  8.  
  9. procedure TTest.FormCreate;
  10. begin
  11.   PrxNear := 0.001;
  12.   PrxFar := 10240;
  13.   PrxFovy := 45;
  14.   PrxAspect := Clientwidth/Clientheight;
  15.   MakeDC;
  16.   MakeRC;
  17. end;
  18.  
  19. procedure TTest.MakeDC;
  20. begin
  21.   FglDC := getDC(self.WindowHandle);
  22. end;
  23.  
  24. procedure TTest.MakeRC;
  25. begin
  26.   FglRC := CreateRenderingContext(FglDC,
  27.                                   [opDoubleBuffered],
  28.                                   32, 24, 0,0,0,0);
  29. end;
  30.  
  31. procedure TTest.FormPaint(Sender: TObject);
  32. begin
  33.   if wglMakeCurrent(FglDC,FglRC) then
  34.   begin
  35.     glMatrixMode (GL_MODELVIEW);
  36.  
  37.     glClearColor(ClearRed, ClearGreen, ClearBlue, ClearAlpha);
  38.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  39.  
  40.     SetView;
  41.  
  42.     // Szene zeichnen
  43.  
  44.    glFlush;              // bearbeitung der GL-befehle beginnen
  45.    glFinish;             // warten bis alle befehle ausgeführt sind
  46.    SwapBuffers(FglDC);   // flackern verhindern
  47. end;
  48.  
  49. procedure TFKanal3D.SetView;
  50. begin
  51.   glEnable(GL_DEPTH_TEST);
  52.   glDepthFunc(GL_LEQUAL);
  53.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  54.  
  55.   glViewPort(0,0,clientwidth,clientheight);
  56.   glMatrixMode(GL_PROJECTION);
  57.   glLoadIdentity;
  58.   gluPerspective(prxFovy, prxAspect, prxNear, prxFar);
  59. end;
  60.  
  61.  


vielleicht kannst Du ja etwas damit anfangen.

Andy


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 17:51 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Zitat:
Ich tippe allerdings sehr stark darauf, dass ein State an einer Stelle nicht dem erwarteten werd entspricht.


Du hattest Recht. Hab beim Rendern im ersten Kontext am Ende den OrthoModus verlassen, und bin zu Anfang des 2. Kontexts dann nicht mehr rein..

Danke + Grüße
Passi


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.008s | 14 Queries | GZIP : On ]