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

Aktuelle Zeit: Fr Jul 18, 2025 08:52

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



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 12:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Raycasting selber zu implementieren ist ziemlich einfach, einmal brauchst du 2-3 Raycast funktionen(die im netz zu finden sind) und halt die Liste deiner Objekte.
LineSphereIntersection,LineBoxIntersection und LineTriangleIntersection sind eigentlich die gängigen.
Für die ersten Anwendungen hab ich das verwendet, dann hab ich später die Funktionen der Physiklibs verwendet.
Picking hab ich in meiner ganzen Zeit nur einmal probiert aber nie produktiv eingesetzt.
http://www.geometrictools.com/LibFoundation/Intersection/Intersection.html
http://www.realtimerendering.com/intersections.html
http://en.wikipedia.org/wiki/Line%E2%80%93sphere_intersection
http://www.lighthouse3d.com/opengl/maths/index.php?raysphereint

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 12:34 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Farbselektion ist besonders bei dynamischer Geometrie im Editor sinnvoll. Für einen schnellen Strahlentest benötigt man Baumstrukturen, die dann ständig angepasst werden müssten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 12:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich habe mit Raycasting bisher noch nicht gearbeitet, da ich so was schlicht und einfach nicht brauche. Aber was man dabei vielleicht auch bedenken sollte. Die Physikbibliotheken machen nichts anderes als solche Vektorberechungen etc. Die sind sehr darauf spezialisiert und optimiert. Und ich gehe jede Wette ein, dass die spezielle CPU Befehle dafür verwenden.

Man kann sicher nicht mal eben eine Formel in eine Funktion klatschen und die dann über alle seine 100.000+ Dreiecke jagen. Die Daten müssen vermutlich in speziell dafür geeigneten Strukturen vorliegen um auch ganze Geometrien von Hause aus ausschließen zu können. Man muss sich halt sehr stark überlegen was man dort macht. Denn ansonsten hat man massiv Rechenaufwand erfolgreich auf die, sowieso schon überforderte, CPU verlagert wärend die extrem spezialisierte GPU da sitzt und wartet.

Das aber nur mal als kleine Anregung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn man z.B. Newton verwendet, dann nutzt Newton ja die internen informationen, also Sphere,Box,Mesh.
Das ist natürlich ned so schön schnell wird aber durch das interne Spatial system wieder behoben, ich hab selber es bisher immer so gemacht.
Liste der sichtbaren Objekte holen, Liste mit Sphere durchgehen und alle rauswerfen ,die ned passen(hast vieleicht noch 4-5 Objekte).
Triangle genauer Test auf das naheste Objekt, in der regel hat man sein Objekt dann schon, sonnst geht man in der Liste weiter.

Sicher kann man normales color picking verwenden aber sobald es daraum geht, mehr als eine GPU zu verwenden, kann man diese funktion(read) nicht mehr nutzen. ATI und NV Treiber schalten die App nicht für MGPU frei und man bekommt auch keine App MGPU Signierung von ATI.
Die CPU ist ja eh nicht ausgelastet(da ja keine physik und ki läuft), die GPU schon, also ist die Lösung sinnvoll.

edit:Beides sind gute Lösungen für den Anfang, raycasting braucht Meshinfos(radius, den man für Frustumculling eh braucht) und colorpicking braucht eine assoziation zwischen Farbe und Objekt. Der Code, den man braucht kopiert man für beide Fälle eh aus dem Inet.
Raycasts sind unabhängig und werden parallel zur gpu verarbeitet aber colorpicking braucht nen pass.
Raycasts sind um einiges schneller und um ein vielfaches genauer, keine Probleme mit Alpha, möglichkeit Objekte dahinter zu selektieren(mehrfach klicken auf der gleichen stelle).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 21:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ich mach das erstma mit ColorSelection, klinkt für meine Ohren einfacher,
und da ich ein blutiger Anfänger bin will ich erstma klein anfangen...
Hab auch schon alles in meinen Projekt eingebaut, nur ein/e Problem/Frage
hab ich noch: glReadPixels liest bei mir für den Alpha Wert der Farben immer
nur 1 aus, obwohl ich es vorher bei den Objekten in 0.1er Schritten abgestuft
hab. Kann es sein das man das Alpha nich benutzen kann, oder mach ich was
falsch? Es geht zu Not auch ohne, is bloß mehr Arbeit!

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Warum brauchst du bei der Farbselektion einen Alphawert? Im Normalfall rendert man die Objekte mit kleinen RGB-Abstufungen und deaktiviert alles Mögliche wie Texturen, Shader, Beleuchtung und Transparenz.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 21:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Abgesehen davon muss der Alphawert in dem Framebuffer nicht enthalten sein. Manche Treiber machen es von hause aus. Manche nur auf verlangen. Und im Endeffekt darf sich auch jeder Treiber entscheiden keinen Alphakanal zu unterstützen. Also Alphawert am besten ignorieren. Außerdem wird durch Blending bei der Farbselektion auch die Farben manipuliert was nur bedingt zu richtigen Ergebnissen führen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 25, 2008 23:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Ich brauch den Alpha Wert weil ich dann alles über Schleifen regeln könnte:
die RGB Werte wären dann die XYZ Werte des Würfels, der grade selektiert
ist und der Alpha wert sollte die Seite des Würfels werden.
und dann lässt sich das ganz einfach lesen: wenn ich das nur über die RGB-
Werte mach wirds halt n bisl aufwendiger. Wenn ich das Alpha nich benutzen
kann, dann hab ich noch n bisl was zu tun ^^

€: Hab mir das grad nochma überlegt, so schwer wird's gar nich, ich hab ja
mio. von kombinationsmöglichkeiten xD

gn8


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 26, 2008 03:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Bei einem mausklick ist die latenz für den read irrelevant... Color picking kann nicht aus OGL3 rausfliegen, weil colorpicking kein bestandteil von ogl ist.
Der selectionsmodus wird dagegen wegfallen. Das macht aber nicht viel aus, da der jetzt kaum noch sinvoll verwendbar ist. (Ist so langsam als wenn man keine hardwarebeschleunigung hat)
Das ideale rendersetzup wäre ein viewport mit 1x1 pixel und angepasster projektionsmatrix.

In zukunft macht es eher sinn einen geometry shader und transform feedback zu verwenden. Dann kann die GPU alle objekte inclusive triangle ID und texturkoordinaten an der treffer position in ein VBO schreiben...

Sicher kann eine baum basierende selektion schneller sein, jedoch macht das nur sinn, wenn dieser eh schon vorhanden ist.

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 26, 2008 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Noch ein Problem entdeckt:
Ich hab im Treibermenü der Graka die Performance auf Qualität gestellt,
bedeutet er rendert meinen Würfel jetzt mit AA und dem ganzen anderen Zeug.
Das sieht zwar gut aus, aber bei der Farbselection stört das, denn am Rand
jedes würfels verschwimmen die Farben, und wenn dann die Frabe am Rand
des Würfels zufällig den Farbwert eines anderen Würfels hat bekomm ich
falsche Ergebnisse.
Kann ich das AA nur vorm rendern der Farbselektion deaktivieren, ohne
alles im Treibermenü umstellen zu müssen?

MfG Bergmann

p.s.: wenn ich das Projekt dann vorstellen will, kommt das dann mit bei
Projekte rein, oder gibts n extra Topic wo man so kleine Projekte vorstellen
kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 26, 2008 13:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bezüglich des AAs sollte man eine gewisse Toleranz einbauen, also angrenzende Felder soweit im Farbraum abgrenzen dass durchs AA keine Fehlselektion entstehen kann. Ansonsten kannst du die Farbselektion auch in einem FBO oder Pixelpuffer machen, dort hat man i.d.R. eh kein AA (auch wenn es im Treiber aktiviert ist), bzw. kann es von Hand deaktivieren.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 26, 2008 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hab mich am PixelBuffer probiert.
Funzt aber irgendwie nich!

das is der Puffer:
Code:
  1. unit PixelBuffer;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes, Windows, DGLOpenGL;
  7.  
  8. const
  9.   PixelFormatAttribs: array[0..12] of gluInt =
  10.   (WGL_SUPPORT_OPENGL_ARB,  GL_TRUE,
  11.    WGL_DRAW_TO_PBUFFER_ARB, GL_TRUE,
  12.    WGL_COLOR_BITS_ARB,      24,
  13.    WGL_ALPHA_BITS_ARB,      8,
  14.    WGL_DEPTH_BITS_ARB,      24,
  15.    WGL_DOUBLE_BUFFER_ARB,   GL_FALSE, 0);
  16.  
  17. type
  18.   TPixelBuffer = class(TComponent)
  19.   public
  20.     Log       : TStringList;
  21.     DC        : HDC;
  22.     RC        : HGLRC;
  23.     ParentDC  : HDC;
  24.     ParentRC  : HGLRC;
  25.     Handle, Width, Height,TextureID : gluInt;
  26.     function IsLost: Boolean;
  27.     procedure Enable;
  28.     Procedure Disable;
  29.     constructor Create(PufferWidth, PufferHeight: gluInt; DC:HDC; RC:HGLRC); reintroduce;
  30.     destructor Destroy; override;
  31.   end;
  32.  
  33. implementation
  34.  
  35. function TPixelBuffer.IsLost : Boolean;
  36. var  Flag : TGLUInt;
  37. begin
  38.   Result := False;
  39.   wglQueryPbufferARB(Handle, WGL_PBUFFER_LOST_ARB, @Flag);
  40.   if Flag <> 0 then Result := True;
  41. end;
  42.  
  43. procedure TPixelBuffer.Enable;
  44. begin
  45.   wglMakeCurrent(DC,RC);
  46. end;
  47.  
  48. procedure TPixelBuffer.Disable;
  49. begin
  50.   wglMakeCurrent(ParentDC,ParentRC);
  51.   //wglReleaseTexImageARB(Handle,0);
  52. end;
  53.  
  54. constructor TPixelBuffer.Create(PufferWidth, PufferHeight: gluInt; DC:HDC; RC:HGLRC);
  55. const EmptyF:TGLFloat = 0;
  56. const PixelBufferAttribs : array[0..4] of TGLUInt =
  57.         (WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
  58.          WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB,   0);
  59. var PFormat     : array [0..64] of TGLUInt;
  60. var NumPFormat  : TGLUInt;
  61. var TempDC      : TGLUInt;
  62. begin
  63.   TempDC := wglGetCurrentDC;
  64.  
  65.   if wglChoosePixelFormatARB(TempDC, @PixelFormatAttribs, @EmptyF, Length(PFormat), @PFormat, @NumPFormat) then
  66.     begin
  67.       ParentDC := DC;
  68.       ParentRC := RC;
  69.       Width  := PufferWidth;
  70.       Height := PufferHeight;
  71.       Handle := wglCreatePBufferARB(TempDC, PFormat[0], Width, Height, @PixelBufferAttribs);
  72.       DC := wglGetPBufferDCARB(Handle);
  73.       RC := wglCreateContext(DC);
  74.       glGenTextures(1, @TextureID);
  75.       glBindTexture(GL_TEXTURE_2D, TextureID);
  76.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  77.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  78.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  79.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  80.     end;
  81. end;
  82.  
  83. destructor TPixelBuffer.Destroy;
  84. begin
  85.   wglDeleteContext(RC);
  86.   wglReleasePbufferDCARB(Handle, DC);
  87.   wglDestroyPbufferARB(Handle);
  88.   Log.Free;
  89.   inherited;
  90. end;
  91.  
  92. end.
  93.  


so hab ich ihn in OnCreate erzeugt:
Code:
  1.   PBuffer := TPixelBuffer.Create(ClientWidth,ClientHeight,DC,RC);
  2.   wglShareLists(RC, PBuffer.RC);


und dann hab ich einfach vorm rendern der Colorselektion PBuffer.Enable aufgerufen.
Und danach logischer weiße PBuffer.Disable;

der fehler liegt denke ich in der Disable Prozedur, ich weiß nicht welche Parameter
die wglReleaseTexImageARB verlangt, und im DGLWiki kommt ne meldung das ich
nich berechtigt bin die Seite zu sehen, wenn ich mich dort belesen will?!

MfG Bergmann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 26, 2008 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
wglReleaseTexImageARB macht doch nur sinn in Verbindung mit wglBindTexImageARB, oder versteh ich das falsch?

Ich würde auch eher FBO nehmen. Fand ich etwas einfacher zu implementieren.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 27, 2008 12:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
zu FBO find ich nix, was bedeutet das ausgeschrieben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 27, 2008 13:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Framebufferobject, siehe auch das Tutorial Framebufferobject.

Gruß Lord Horazont

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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