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

Aktuelle Zeit: Fr Jul 18, 2025 08:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Sep 22, 2011 19:28 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
Hallo,

ich arbeite gerade an eine OpenGL GUI ToolKit und habe nun ein Problem mit dem ScrollBalken. Wenn ein Benutzer scrollt verschiebe ich einfach das Parent dies funktioniert, da jedes Widget seinen eigenen scisor bereich verwendet. Das Problem tritt nun auf sobald ein Objekt teilweise außerhalb des Viewports ist (das Objekt verschwindet dann komplett). Zur verdeutlichung habe ich noch 3 Bilder des Problems beigefügt.
Noch ein bisschen was zur Technik:
Jedes Objekt besteht aus einem einzelnen texturierten VBO.
Der Viewport wird auf die größe des Fensters gesetzt.
Die orthogonale Projektionsmatrix hat die selben Werte wie der Viewport.

Dateianhang:
ScrollError1.jpg

Dateianhang:
ScrollError2.jpg

Dateianhang:
ScrollError3.jpg


Mit freundlichen Grüßen
Archaon


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Zuletzt geändert von Archaon am Di Sep 27, 2011 17:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 25, 2011 16:57 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Vielleicht gibt es ein Problem, wenn bei glScissor die Koordinaten negativ sind. Probier' man die auf 0 zu begrenzen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 27, 2011 17:35 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
Nein an dem Scissortest lag es nicht. Ich hab jetzt eine Lösung gefunden allerdings versteh ich sie nicht so ganz :). Ich hatte es bisher immer so gemacht, dass der viewport von 0/0 bis windowWidth/windowHeight geht und die orthogonale Projektionsmatrix genauso. Wenn ich jetzt allerdings zumbeispiel ein Objekt um -10 in x-Tichtung verschiebe ist es weg wenn ich allerdings die Projektionsmatriix auf 10/0 bis windowWidth + 10/windowHeight setze und alle Objekte um +10 in x-Richtung verschiebe damit sie alle an der richtigen Position sind verschwindet das Objekt nicht wenn ich es um -10 in x-Richtung verschiebe.
Mein Frage ist jetzt wie Berechnet OpenGL die Ebenen für den Clippingtest? Es funktioniert zwar jetzt alles ich verstehe nur nicht warum :).

Mit freundlichen Grüßen
Archaon


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 27, 2011 18:12 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Zu dem Clipping kann ich nichts sagen, normalerweise funktioniert das ja auch. Wenn die Projektionsmatrix falsch ist, könnte es vllt Probleme geben. Erstellst du die mit glOrtho oder manuell?
Vielleicht kannst du mal ein bischen Code zeigen, denn so wie es jetzt funktioniert, ist es eigentlich nur ein Workaround.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 29, 2011 09:56 
Offline
DGL Member

Registriert: Mi Jan 21, 2009 09:05
Beiträge: 13
Ich erstelle die Projektionsmatrix manuelle:

mwidth = Fensterbreite
mheight = Fensterhöhe
mminX ist größer als 0 wenn ein Widget durch scrollen eine Position kleiner 0 in X-Richtung hat
mminY ist größer als 0 wenn ein Widget durch scrollen eine Position kleiner 0 in Y-Richtung hat
Code:
  1. void WindowBase::updateProjectionMatrix()
  2. {
  3.     //calculate orthogonal projection matrix
  4.     //
  5.     //l = left
  6.     //r = right
  7.     //b = bottom
  8.     //t = top
  9.     //n = near clipping plane
  10.     //f = far clipping plane
  11.     //
  12.     //2/(r-l) 0       0        -(r+l)/(r-l)
  13.     //0       2/(t-b) 0        -(t+b)/(t-b)
  14.     //0       0       -2/(f-n) -(f+n)/(f-n)
  15.     //0       0       0        1
  16.     float left = mminX;
  17.     float right = mwidth + mminX;
  18.     float bottom = mheight + mminY;
  19.     float top = mminY;
  20.     float near = -1.0f;
  21.     float far = 1.0f;
  22.     float rml = right - left;
  23.     float rpl = right + left;
  24.     float tmb = top - bottom;
  25.     float tpb = top + bottom;
  26.     float fmn = far - near;
  27.     float fpn = far + near;
  28.     morthoMat = Matrix<float>(2.0f / rml, 0.0f, 0.0f, -rpl/rml,
  29.                               0.0f, 2.0f / tmb, 0.0f, -tpb/tmb,
  30.                               0.0f, 0.0f, -2.0f / fmn, -fpn/fmn,
  31.                               0.0f, 0.0f, 0.0f, 1.0f);
  32. }


Beim rendern wird die berechnete Matrix verwendet
Code:
  1. void WindowBase::render()
  2. {
  3.     performLayout();
  4.    
  5.     for(unsigned int i = 0; i < maddScrollBarToList.size(); i++)
  6.         maddScrollBarToList[i]->checkForScrollBars();
  7.     maddScrollBarToList.clear();
  8.    
  9.     updateScissorBox();
  10.    
  11.     Renderer::setProjectionMatrix(morthoMat);
  12.    
  13.     Renderer::setScissorTest(true);
  14.     Renderer::enableBlend(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
  15.     Widget::render();
  16.     Renderer::disableBlend();
  17.     Renderer::setScissorTest(false);
  18.    
  19.     if(monRenderCB != NULL)
  20.         monRenderCB->call();
  21. }


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 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.009s | 16 Queries | GZIP : On ]