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

Aktuelle Zeit: So Jul 06, 2025 14:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit 2 Fenstern
BeitragVerfasst: Fr Mär 09, 2007 10:16 
Offline
DGL Member

Registriert: Mo Jan 29, 2007 09:14
Beiträge: 5
Hallo,


ich habe ein Programm unter Vs2005 und Mfc geschrieben, in dem ich 2 unabhängige Fenster mit OpenGL Instanzen mit je eigenenm Dc verwende.

Bei 9 von 10 Rechner läuft alles ohne Probleme, bei einem jedoch wird in einem Fenster jedoch nur Müll angezeigt,

der aus Texturen, die NUR in dem andern Fenster geladen werden, und teilen von Desktops-Icons besteht.


Deswegen nehmen ich an, das das Problem erst auf dem Weg zur / in der Grafikkarte entsteht.


Hatt jemand schon mal sowas ähnliches erlebt ?

Woran könnte es liegen ?


mfg Knut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 11:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst vor jedem Rendervorgang explizit den Renderkontex aktivieren. Interessant wäre evtl auch ob es sich dabei um ein System mit meheren Grafikkarten handelt. Evtl könnte es auch sein, dass die Erstellung des Kontexes nicht funktioniert hat.

So etwas in diese Richtung gab es schon einmal aber dort wurde vergessen den Framebuffer zu löschen. Somit war halt der ursprüngliche Inhalt noch vorhanden. Das wird wohl denke ich nicht der Fall sein.

Evtl solltest du dir mal anschauen was das Tool glView zu dem System sagt.

Leider kann man ohne detailierte Informationen über das System bzw über deinen Code nicht viel sagen. Entweder hast du bei dir im Code irgendwo ein Problem oder die Implementation des OpenGL Treibers ist entsprechend alt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 12:00 
Offline
DGL Member

Registriert: Mo Jan 29, 2007 09:14
Beiträge: 5
Hallo,

leider kann ich glView nicht verwenden, das der Rechner auf dem der Fehler ensteht nicht von mir ist.

Hier mal der Code :

Code:
  1. hdc = ::GetDC(m_hWnd);
  2.  
  3.         CPaintDC dc(this); // device context for painting
  4.         HGLRC hglrc;
  5.      
  6.         glClearColor( 0.162f, 0.181f , 0.205f,0 );
  7.        
  8.         glColor3f(1, 1, 1);
  9.        
  10.                
  11.         if (hglrc = wglCreateContext(hdc))
  12.         {
  13.  
  14.          
  15.             // try to make it the thread's current rendering context
  16.             if(wglMakeCurrent(hdc, hglrc))
  17.             {
  18.                 CRect rect=NULL;
  19.                 if((m_pParentWnd!=NULL)&&(m_pParentWnd->GetDlgItem(IDC_LENGTH_3D_ANSICHT))!=NULL)
  20.                     {
  21.                     m_pParentWnd->GetDlgItem(IDC_LENGTH_3D_ANSICHT)->GetWindowRect(rect);
  22.                     }
  23.              
  24.                 if(rect!=NULL)
  25.                 {
  26.            
  27.                     //render here
  28.                     glViewport(0, 0, rect.Width(),rect.Height());
  29.                        
  30.                     // Hier wird der Mittelpunkt auf den die Perspektive zuläuft
  31.                     // zurückgesetzt.
  32.                     glMatrixMode(GL_PROJECTION);
  33.                     // Hier wird die Projektionsmatrix festgelegt
  34.          
  35.            
  36.          
  37.                     glLoadIdentity();
  38.                     // und angepasst
  39.  
  40.                     gluPerspective(45.0f,(GLfloat)rect.Width()/(GLfloat)rect.Height(),0.1f,100.0f);
  41.                     // Hier wird die das Verhältnis der Höhe zur Breite übergeben
  42.                     // und der Verzerrungswinkel von 45 Grad übergeben
  43.  
  44.                     glMatrixMode(GL_MODELVIEW);
  45.                     // Hier wird die sogenannte modelview-Matrix festgelegt
  46.  
  47.                    
  48.                  glClearColor( 0.63529f, 0.7098f , 0.8039f,0 );
  49.                     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  50.                
  51.                     InitGL();
  52.                     if(m_LengthCalc !=NULL)
  53.                     {
  54.                    
  55.                        
  56.  
  57.                         switch ( m_iOpenGl_Mode )
  58.                         {
  59.                             case 1 :  //Vorlage 1
  60.                             {
  61.                                 if(m_LengthCalc->DrawGLScene_1())
  62.                                 {
  63.                                 SwapBuffers(hdc);
  64.                                 }
  65.                                 break;
  66.                             }
  67.  
  68.                             case 2 : //Vorlage 2
  69.                             {
  70.                                 if(m_LengthCalc->DrawGLScene_2())
  71.                                 {
  72.                                 SwapBuffers(hdc);
  73.                                 }
  74.                                 break;
  75.                             }
  76.  
  77.                             case 3 : //Vorlage 3
  78.                             {
  79.                                 if(m_LengthCalc->DrawGLScene_3())
  80.                                 {
  81.                                 SwapBuffers(hdc);
  82.                                 }
  83.                                 break;
  84.                             }
  85.  
  86.                             case 4 : //mit Werten
  87.                             {
  88.                                 if(m_LengthCalc->DrawGLScene_Value())
  89.                                 {
  90.                                 SwapBuffers(hdc);
  91.                                 }
  92.                                 break;
  93.                             }
  94.                         }
  95.                        
  96.                     }
  97.                 //  SwapBuffers(hdc);
  98.                     wglMakeCurrent(NULL, NULL) ;
  99.                     ::ReleaseDC (m_hWnd, hdc) ;
  100.                     wglDeleteContext(hglrc);
  101.            
  102.                 }
  103.  
  104.             // Do not call CWnd::OnPaint() for painting messages
  105.  
  106.             }
  107.         }




EDIT :


Sobald ich jeweils eines deaktiviere Funktioniert das andere allein ohne Probleme, also tritt der Fehler nur auf wenn beide aktiv sind


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Irgendetwas stimmt an deinem Code nicht. Zu mindest sieht der für meinen Geschmack SEHR merkwürdig aus. Ist das die Methode die aufgerufen wird, wenn das Fenster neu gezeichnet werden soll?

Weil für meinen Geschmack erstellst du den RC zu häufig. Du Darfst den RC + dazugehörigen DC nur einmal erstellen. Und zwar nur beim ersten Start des Programmes. Beim Rendern SOLLTEST du nur noch wglMakeCurrent benutzen und anschließend deine Szene zeichnen + SwapBuffers. Aber OpenGL bei jedem Zeichnen neu zu erstellen und neu zu laden ist ganz und gar nicht gut. Denn geladene Texturen, Daten müssen neu erstellt werden etc. Und das ist alles andere als schnell.

Also ändere deinen Code einmal wie folgt.
Beim Erstellen des Fenster -> DC/RC erstellen -> OpenGL Initialisieren
Beim Zeichenen -> wglMakeCurrent -> Zeichnen -> SwapBuffers
Beim Schließendes Fensters -> DC/RC löschen

Anschließend sollte es auch auf dem letzten Rechner gehen und dürfte überall sogar noch entsprechend schneller sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 09, 2007 13:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Lossy eX hat geschrieben:
Irgendetwas stimmt an deinem Code nicht. Zu mindest sieht der für meinen Geschmack SEHR merkwürdig aus. Ist das die Methode die aufgerufen wird, wenn das Fenster neu gezeichnet werden soll?


Ja das ist die OnPaint-Methode.

@harry: es empfiehlt sich, die OnPain der Elternklasse trotzdem aufzurufen, aber an ERSTER Stelle natürlich.
Ansonsten siehe das was Lossy schon geschrieben hat.
Ich weis nicht wie du dein Fenster erstellst:

wenn es ein Dialog ist, dann überschreibe die OnInitDIalog und packe da die Initialisierung ein.
Ansonsten schreibe dir eine Init-Methode, erstelle das Fenster mit Create und tue dann DANACH die init-Fkt. aufrufen.
Bei Fragen poste einfach, mit MFC kenn ich mich aus =)

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 12, 2007 17:23 
Offline
DGL Member

Registriert: Mo Jan 29, 2007 09:14
Beiträge: 5
Hallo,


genau das wars, jetzt läuft es ohne Probleme und sogar noch schneller.


Thxs

Knut


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]