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

Aktuelle Zeit: Fr Jul 18, 2025 12:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Nov 03, 2005 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
so also mein Problem: ich habe ein Anwenfung, solange ich die allein benutze funktioniert alles mit OpenGL.
Nun habe ich die Form in ein anderes Programm integriert. wenn ich nun die Form mit Show oder ShowModal aufruf, seh ich nix, also der zeichnet nichts.
Ich vermute(is aber ein schuss ins blaue) das ich vergess irgendwo den Rendercontext nochmal zu setzen. Das ist aber geraten, weil ich nicht weis was es sonst sein soll.

Hier mein Reihenfolge:

In der formCreate wird OpenGL initialisiert, also Pixelformat usw. , Renderkonetxt anlegen und mit HDC verbinden

Da das die einzige Form mit OpenGL ist, rufe ich nirgends wieder wglMakeCurrent auf. in der stand-Alone-Anwendung geht jka auch alles.
Liegt es daran: Falls ja was muss ich machen das es klappt?
Oder ist es was anderes? Bin ratlos :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 03, 2005 19:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Also ich habe rausgefunden, dass es mit dem Renderkontext zusammen hängt. Wenn ich es in der FormShow initialisiere dann klappt es.
1. kann mir das wer erklären?
2. das kann ich nicht benutzen, weil wenn ich die Form ein zweites mal öffne stürzt er da dann ab. Also wie kann ich wo was initialisieren???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 03, 2005 21:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Poste mal den Relevanten Code.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 03, 2005 22:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
eventuell hängt es damit zusammen, das im formcreate die form irgendwelche sachen anders hat als im formshow, da sie ja nicht sofort angezeigt wird (nehm ich jetzt mal an).

zu dem problem im formshow: einfach ein private boolean "init", im formcreate auf true setzen, im formshow überprüfen, initialisieren, und dann auf false setzen.

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 09:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Warum das im OnShow geht aber im OnCreate nicht verstehe ich nicht ganz, da an beiden Stellen das Form bereits existiert. OnShow ist nur Bruchteile vor dem Anzeigen. Ich persönlich benutze immer OnShow. Könnte mir aber vorstellen, dass das Problem eher wo anders liegt. Wo initialisiertst du denn eigentlich den ViewPort?

Dein "Problem" mit dem doppelten ShowAufruf ist kein Problem. Das ist höchstens ein wiederer Umstand. ;-) Überlege mal genau was du da machen könntest! Im Endeffekt musst du ja lediglich verhindern, dass der Initialisierungscode zwei mal aufgerufen wird. Am Einfachsten ginge dies in dem du abprüfst ob dein DC und dein RC gesetzt sind. Bei Deinitialisieren müsstest du die aber wieder auf 0 setzen. Oder du machst eine Booleanvariable. Evtl wäre es auch sinnvoll deine Form beim Beenden frei zu geben und beim Show wieder richtig zu erstellen. Also Möglichkeiten gibt es genug. Es bleibt deiner Phantasie überlassen was du machst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei OnCreate hat die Form nicht unbedingt ein Handle. Das wird erst erstellt, wenn es das erste Mal benötigt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 15:00 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Code:
  1. Bei OnCreate hat die Form nicht unbedingt ein Handle. Das wird erst erstellt, wenn es das erste Mal benötigt wird.
Man braucht es eben in OnCreate und gerade dann wird sie erstellt. ( myDc := GetDc( Handle ); )

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Code:
  1.  
  2. // in der formCreate
  3. dcpanel:=getDC(drawpanel.handle);
  4.  
  5. if (not setPixelFormat(dcpanel)) or (not setRenderingContext(dcpanel)) then
  6.        begin;
  7.              MessageDlg('OpenGL konnte nicht initialisiert werden', mtError, [mbOk], 0);
  8.              halt;
  9.        end;
  10.  


Code:
  1.  
  2. function setPixelFormat(hDevice : HDC) : boolean;
  3. var
  4.   PixelFormat      : GLuint;
  5.   PFD              : pixelformatdescriptor;
  6.   bResult          : boolean;
  7. begin
  8.      bResult:= true;
  9.      with pfd do
  10.        begin
  11.             nSize:= SizeOf( PIXELFORMATDESCRIPTOR );
  12.              nVersion:= 1;
  13.               dwFlags:= PFD_DRAW_TO_WINDOW
  14.                 or PFD_SUPPORT_OPENGL
  15.                 or PFD_DOUBLEBUFFER;
  16.               iPixelType     := PFD_TYPE_RGBA;
  17.               cColorBits     := 32;           //Farbtiefe
  18.               cRedBits       := 0;
  19.               cRedShift      := 0;
  20.               cGreenBits     := 0;
  21.               cBlueBits      := 0;
  22.               cBlueShift     := 0;
  23.               cAlphaBits     := 0;
  24.               cAlphaShift    := 0;
  25.               cAccumBits     := 0;            //Accumulation Buffer
  26.               cAccumRedBits  := 0;
  27.               cAccumGreenBits:= 0;
  28.               cAccumBlueBits := 0;
  29.               cAccumAlphaBits:= 0;
  30.               cDepthBits     := 16;           //Z-Buffer Tiefe
  31.               cStencilBits   := 0;            //Stencil Buffer
  32.               cAuxBuffers    := 0;
  33.               iLayerType     := PFD_MAIN_PLANE;
  34.               bReserved      := 0;
  35.               dwLayerMask    := 0;
  36.               dwVisibleMask  := 0;
  37.               dwDamageMask   := 0;
  38.        end;
  39.  
  40.        //Pixelformat wählen und einsetzen
  41.        PixelFormat:= ChoosePixelFormat(hDevice, @pfd);
  42.        if (PixelFormat =0 ) then
  43.          bResult:= false;
  44.  
  45.        if (not Windows.SetPixelFormat(hDevice,PixelFormat,@pfd)) then
  46.          bResult:= false;
  47.  
  48.        setPixelFormat:= bResult;
  49. end;
  50.  
  51. //
  52. function setRenderingContext(hDevice : HDC) : boolean;
  53. var  hRContext  : HGLRC;
  54.      bResult   : boolean;
  55. begin
  56.      bResult:= true;
  57.      hRContext:= wglCreateContext(hDevice);
  58.  
  59.      if (hRContext = 0) then
  60.        bResult:= false;
  61.  
  62.      //RenderContext setzen
  63.      if  not wglMakeCurrent(hDevice,hRContext) then
  64.        bResult:= false;
  65.  
  66.      setRenderingContext:= bResult;
  67.  
  68.      glEnable(GL_DEPTH_TEST);
  69.      glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
  70.      glLightModeli(GL_LIGHT_MODEL_AMBIENT,1);
  71.      glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
  72.      glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,1);
  73.  
  74.      //
  75.      glEnable(GL_COLOR_MATERIAL);
  76. end;
  77.  


Das ist meine Initialisierung. Und wenn das halt in der formCreate steht in meiner Standalone-Anwendung funzt das halt auch.
Wenn ich die Unit woanders als modalen Dialog auruf, seh ich einfach nichts(beim nichtmodalen funktioniert es jetzt). Aber ich bekomme einen DC und die Methoden liefern auch true zurück.

Versteh ich nicht. Hat wer noch ne Idee?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ich hab das ganze mal getrennt. Im create ist die setPixelFormat, wenn ich nun die setRendereingContext in der Show aufrufe, funktioert es wieder beim nichmodalen, aber es gibt eine Fehler
meldung beim modalen, also das Erstellen des Rendercontexts bringt einen Fehler. ???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 04, 2005 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Also ich habe jetzt die gesamte Initialisierung in die OnShow gepackt und in die Close das Freigeben des Speichers. So funktioniert das jetzt erstmal. Trotzdem würde mich mal interessieren, woran das liegt, dass es bei modal nicht funktioniert in der create, also wer was weis ...

noch was anderes kurzes: in der Show rufe ich eine Methode auf, die was zeichnet, Jedoch wird danach immer noch ein EraseBackground oder sowas aufgerufen, sodass meien Grafik wieder überzeichent wird und ich erst wieder per verschieben ein OnDraw auslösen muss.
Wie krieg ich das weg?


edit: noch ne Speicertechnische Frage: wenn ich das setPixelFormat mehrmahls benutz mach ich da memleaks?

THX


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.012s | 15 Queries | GZIP : On ]