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

Aktuelle Zeit: Mi Jul 16, 2025 09:46

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Hi,
dein Raytracer ist richtig geil!!!
Macht ein richtig sprachlos wenn man so sieht was du alles zusammen programmierst... Da fehlen ein Laien wie mir einfach die Worte.
Richtig gut find ich auch, dass du ein Tutorial bzw. eine Tutorialreihe erstellst :mrgreen:

Das bringt mich aber auch schon zu meiner Frage. Und zwar verwendest du ja in deinem ersten Code-Beispiel
Code:
  1.  
  2. public struct Ray
  3. {
  4.     public Vertex3 Origin;
  5.     public Vertex3 Direction;
  6.  
  7.     public Vertex3 Evaluate (double t)
  8.     {
  9.         return Origin + t * Direction;
  10.     }
  11. }
  12.  


Vertex3, das wird ja ein struct oder eine Klasse sein. Und ich wollte halt mal sehen wie die aufgebaut ist (bzw den Quelltext von dieser sehen).
Weil ich würde liebend gerne auch einen Raytracer mit Anleitung deines Tutorials schreiben, jedoch fangen dort schon meine Probleme an.
Würde mich sehr freuen ;P

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 20:15 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Vertex3 ist ein Vektor, entweder als array oder mittels x, y und z gekennzeichnet.


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Da wäre ich mir nicht so sicher, Seth:
Code:
  1.  
  2. public double RayIntersect ( Ray ray )
  3. {
  4.     double boundingSquare = sphereRadius * sphereRadius ;
  5.     ray.Origin -= Position;
  6.     double a, b, c;
  7.     a = ray.Direction.DotDot ;
  8.     // DotDot ^= Skalarprod mit sichselbst : <d, d>
  9.     b = 2 * ( ray.Origin * ray.Direction );
  10.     // * ^= normales Skalarprod
  11.     c = ray.Origin.DotDot - boundingSquare;
  12.  
  13.     double t1 , t2 ;
  14.     int roots = CalcQuadricRoots (a, b, c, out t1, out t2) ;
  15.  
  16.     if (roots > 0)
  17.         return t1 >= 0 ? t1 : t2 ;
  18.         // kleinsterpositiver pos. Wert aus t1, t2
  19.     else
  20.         return -1; // Kein Schnittpunkt
  21. }


Zumindest im Code ist es anscheinend eine Klasse, da hier auf DotDot zugegriffen wird, was wohl eher kein Feld sondern eher eine Methode ist.

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  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 12, 2007 21:35 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
:) Danke für die Blumen. Hab auch vor die Reihe bei Gelegenheit fortzusetzen :twisted:
Code:
  1.  
  2. namespace GeometryMath
  3. {
  4.     /// Defines a 3D Vertex3
  5.     public struct Vertex3
  6.     {
  7.         /// x,y,z Koordinates of Vertex
  8.         public double x, y, z;
  9.  
  10.         /// Creates Vertex3 with given coordinates
  11.         public Vertex3(double px, double py, double pz)
  12.  
  13.         /// Indexed acces to the three components of the Vertex3
  14.         public double this[int coordinate]
  15.  
  16.         /// Gives the Vertex as an actual quaternion, i.e. the Vertex coordinates go to the imaginary components
  17.         /// of the Quaternion, while the real coordinate is zero.
  18.         public Quaternion EquivalentQuaternion()
  19.  
  20.         /// The 2-Norm length of the Vertex = Sqrt(this^t*this)
  21.         public double Magnitude
  22.         {
  23.             get
  24.             {
  25.                 return Math.Sqrt(x*x+ y*y + z*z);
  26.             }
  27.         }
  28.  
  29.         /// Calculates this*this
  30.         public double DotDot
  31.         {
  32.             get
  33.             {
  34.                 return x*x + y*y + z*z;
  35.             }
  36.         }
  37.  
  38.         /// Returns the normalized Vector
  39.         public Vertex3 Normalized()
  40.         {
  41.             Vertex3 res = this;
  42.             res.Normalize();
  43.             return res;
  44.         }
  45.  
  46.         /// Normalizes the Vertex inplace.
  47.         public bool Normalize()
  48.  
  49.         /// Calculates DotProduct
  50.         public double Dot(Vertex3 v1)
  51.         {
  52.             return x * v1.x + y*v1.y + z*v1.z;
  53.         }
  54.  
  55.         /// Cross product
  56.         public Vertex3 Cross(Vertex3 v1)
  57.  
  58.         /// adds vectors
  59.         public Vertex3 Add(Vertex3 v1)
  60.  
  61.         /// subtracts vectors
  62.  
  63.         public Vertex3 Subtract(Vertex3 v1)
  64.  
  65.         /// Scales the Vertex
  66.         public Vertex3 Scale(double lambda)
  67.  
  68.         /// Adds to vertices
  69.         public static Vertex3 operator +(Vertex3 q1, Vertex3 q2)
  70.  
  71.         /// Subtracts Vertices from another
  72.         public static Vertex3 operator -(Vertex3 q1, Vertex3 q2)
  73.  
  74.  
  75.         /// Builds inverse of Vertex
  76.         public static Vertex3 operator -(Vertex3 q1)
  77.         {
  78.             return q1.Scale(-1.0);
  79.         }
  80.  
  81.         /// Returns the Vertex
  82.         public static Vertex3 operator +(Vertex3 q1)
  83.         {
  84.             return q1;
  85.         }
  86.  
  87.         /// Calculates the dot Product
  88.         public static double operator *(Vertex3 q1, Vertex3 q2)
  89.  
  90.         /// Scales the Vertex
  91.         public static Vertex3 operator *(double scale, Vertex3 q1)
  92.             return q1.Scale(scale);
  93.  
  94.         /// Returns Vertex as string
  95.         public override string ToString()
  96.         {
  97.             return String.Format(CultureInfo.CurrentCulture, "({0}; {1}; {2})", x, y, z);
  98.         }
  99.  
  100.         /// Returns whether the objects consists of real doubles or values of infty/nan, etc.
  101.         public bool RealDoubles
  102.         {
  103.             get
  104.             {
  105.                 for (int i = 0; i < 3; i++)
  106.                 {
  107.                     if (double.IsInfinity(this[i]) || double.IsNaN(this[i])) {
  108.                         return false;
  109.                     }
  110.                 }
  111.                 return true;
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117.  

Womit die Frage nach der Struktur geklärt sein müsste (ein paar Konstruktionsdetails hab ich entfernt, müsste aber alles wesentliche geblieben sein) - allerdings erlaubt C# auch methoden in structs - die werden dann halt von der Runtime fest hineinübersetzt. Nachdem sie nicht überschrieben werden können macht das auch Sinn und code der zusammengehört (also die funktionen die nur für das struct gedacht sind) kann so auch tatsächlich zusammengefasst werden... Und man könnte sonst Operatoren nicht überladen (jedenfalls nicht ala C#). Und die überladenen Ops haben das Programmieren des Raytracers in dieser Sprache irgendwie sehr freundlich und übersichtlich gestaltet.


Zuletzt geändert von Delphic am Mi Jun 24, 2009 11:40, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 17:15 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
danke wirs geben ;P
kenne leute die sowas nich machen nur um einen zu ärgern aba ich muss auch ganz offen gestehen ...
Zitat:
warum bei einem Multiplikationsoperator auf den Quadratintegrierbaren Funktionen auf einem Messraum das Spektrum gleich dem wesentlichen Bild der Multiplikationsfunktion ist. Wenn ein element im Spektrum ist, so ists im Bild - das ist leicht, hab ich schon gebastelt (man negiert die folgerung und kanns dann einfach ausrechnen), aber anders rum, ists schwierig...

hab kein wort vertanden ;P

aba ich hab ja noch zeit um sowas zu verstehn ;P

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 17:22 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
thebubble hat geschrieben:
benutzt du ja das struct bzw die klasse Vertex ... da ich leider noch nicht wirklich das alles mit vektoren und so verstehe liegen da schon meine probleme im tutorial (Vektorraum und was so dazu gehört kommt laut meinem tutor erst in der 13. Klasse und noch 2 jahre warten hab ich keine lust) also wollt ich fragen ob du mir vllt den quelltext von diesem struct zeigen könntest^^

hmm, dann bringt dir mein auszug erstmal noch nicht schrecklich viel, aber der code als solche wohl auch nicht. Das tolle an Vektorräumen ist aber, daß alles genau so läuft wie man erwartet (naja fast, aber im endlichdimensionalen ist alles prima ;-) ) Heisst, man versteht die Grundzüge auch recht stressfrei bevor man in der 13. Klasse ist und ein Mathestudium braucht man auch nicht anzugreifen. In jedem Fall ist es fast unumgänglich sich damit zu beschäftigen, wenn Du 3D Grafik machen willst. Am besten wird sein, wenn du Dir mal ein entsprechendes Buch ausleihst und Dich einliest. Kannstes ja erstmal mit dem Mathebuch zur Geometrie aus der 13. Klasse probieren (frech beim schulbibliothekar nachfragen) - dann solltest Du bereits das meiste stressfrei verstehen können. Nur die Bezeichnungen sind eventuell anders - ne Blick in die Wikipedia klärt einen dann meistens auf... Besonders die englische wiki ist in mathe sehr fit und damit auch im bereich Vektrorräumen/Geometrie.
Zitat:
hab kein wort vertanden ;P

Denk Dir nix ;-) Ist schon recht speziell was ich da mache. Hab übrigens ne Lösung gefunden :-)


Zuletzt geändert von Delphic am Sa Jul 11, 2009 08:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Bitte...? Gibt es da vielleicht ein 'praktisches' Beispiel? (Also nur wenns keine Umstände macht) :D

_________________
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: Di Nov 13, 2007 19:42 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Zitat:
beim schulbibliothekar nachfragen

du wirst es vllt nich glauben aber sowas ham wir nich ma .. (und unsere schule nennt sich mathematishc-naturwissenschaftlich-technisch erweitert)
ich hatte auch shcon ma direkt meinen Mathe Lehrer gefragt ... aba der darf mir das nich ausleihen weil die nur einen klassen satz ham und der wirklich jeden tach benutzt wird ...
warum ich dann aba nich ma nen buch inna mittagspause ham durfte weiß ich bis heute nich ;P

und inne uni kann ich auch noch nich ausleihen (anmeldung läuft noch^^)

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 20:23 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
thebubble hat geschrieben:
du wirst es vllt nich glauben aber sowas ham wir nich ma

Aua... In diesem land reden sie alle wie närrsch von eliteförderung und dann hamse nichtmal für nen interessierten schüler ne buch zur verfügung...
Zitat:
und inne uni kann ich auch noch nich ausleihen (anmeldung läuft noch^^)

Bei uns muss man nur persöhnlich mit persoaufkreuzen, dann kriegt man den bib-ausweis direkt inne hand und kann loslegen. Naja ;-)


Zuletzt geändert von Delphic am Mi Jun 24, 2009 11:48, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 13, 2007 22:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
naja meinte ja uni bibo ... aba da muss man halt erst angemeldet sein damit man die mitnehmen darf (also ausleihen)
genau so bei der stadtbibo

naja dann werd ich ma weiter googlen und mir das wiki durchlesen ;P

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 14, 2007 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
muahaha ich habs jetzte einiger maßen verstanden^^
und bin auch schon recht weit im tutorial (im ersten ;P)
aber hab doch doch noch ein paar problemchen gefunden ...
huhu
hab wieda nen bssl was gemacht ... und bin auf problemchen gestoßen
PSgn hab ich nich gefunden ... also einfach schnell selber deklariert und wollt fragen ob das so richtig is:
Code:
  1. public int PSgn(double i)
  2. {
  3.  if (i<0)
  4.   return -1;
  5.  else
  6.   return 1;
  7. }
  8.  

mein nächstes problem war dass ich nich wusste wohin mit ShootRay und RaytraceImage ...
da hab ich dann wegen ner klasse/nem struct überlegt und bin hier drauf gekommen (hab in kommis nen paar probleme beschrieben)
Code:
  1. public struct Camera
  2.         {
  3.             public Vertex3 Origin;
  4.             public int left,right,top,bottom;
  5.             public int widthpixels,heightpixels;
  6.             public int BackgroundColor;
  7.             public int[,] bild = new int[right-left,bottom-top]; /* <--ergibt Fehler: "Strukturen können keine Instanzfeldinizialisierer enthalten"
  8.                                                                   * vllt syntax-fehler? (hab mir mit nen 2d array gedacht den farbwert jedes pixels zu speichern)
  9.                                                                   * aber irgendwie gibs probleme mit dem name "bild"
  10.                                                                   */
  11.             public double far,near;
  12.             public Sphere[] spheres;
  13.             public Ray ShootRay ( int x, int y )
  14.             {
  15.                 Ray result = new Ray();
  16.                 result.Origin = Position;
  17.                
  18.                 double xpart, ypart;
  19.                 xpart=((double)x)/(double)widthpixels;
  20.                 ypart=((double)y)/(double)heightpixels;
  21.                
  22.                 xpart = left + xpart * ( right - left);
  23.                 ypart = top + ypart * (bottom - top);
  24.                        
  25.                 result.Direction.Set(xpart,ypart,1.0);
  26.                
  27.                 result.Direction.Normalize(); //ich hab noch keinen brauchbaren quelltext zu dieser methode :(;P
  28.                 return result;
  29.             }
  30.             public void RaytraceImage ()
  31.             {
  32.                 int width = right - left;
  33.                 int height = bottom - top;
  34.                 for (int x = 0; x< width; x++)
  35.                     for (int y = 0;y < height; y++)
  36.                 {
  37.                     Ray shoot = ShootRay(x,y);
  38.                     double maxdist = double.MaxValue; //double.Infinity gabs net ... da hab ichs einfach damit probiert
  39.                    
  40.                     foreach (Sphere obj in spheres)
  41.                     {
  42.                         double hitdist = obj.RayIntersect(shoot);
  43.                         if (hitdist > 0 && maxdist > hitdist)
  44.                             maxdist = hitdist;
  45.                     }
  46.                     if (maxdist < double.MaxValue)
  47.                     {
  48.                         SetColor(x ,y, Colors.Gray (Math.Min(Math.Max(0,(maxdist - near)/(near - far)),1.0)));
  49.                     }
  50.                     else
  51.                         SetColor(x, y, BackgroundColor);
  52.                 }
  53.             }
  54.             public void SetColor(int x, int y, int color)
  55.             {
  56.                 bild[x,y]=color;
  57.             }
  58.         }

ja und wollte halt fragen ob das bei deinem raytracer so ähnlich implementiert wurde ... oder halt ob das auch eine relativ leichte möglichkeit wäre
hoffe du kannst mir helfen :>

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Zuletzt geändert von thebubble am Mi Nov 14, 2007 23:00, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 14, 2007 22:13 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Dann weiß ich ja jetzt wen ich fragen muss wenn ich probs in Quantenmechanik hab ;)

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 14, 2007 23:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schön das es Leute wie euch gibt. Dann muss ich mich wenigstens nicht damit beschäftigen/interessieren. :twisted: :wink:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 15, 2007 21:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Diese Beiträge haben mich mal inspiriert, mich auch mal mit dem Thema auseinanderzusetzen und etwas auszuprobieren, wozu ich mit einigen Codebeispielen etwas größer ausholen muss. Sorry, falls es etwas arg lang wird; wenn ich übertrieben habe, kürze ich den Beitrag gerne noch... :roll:

Erstmal hab ich das erste Tutorial grob nach eigenen Vorstellungen interpretiert und mal mehr oder weniger Q&D (halt in Delphi und nicht in C#) drauf losgecodet.
Etwa sowas kam dabei raus:
Code:
  1. [...]
  2.   for i := 0 to 767 do
  3.   begin
  4.     P := Result.ScanLine[i];
  5.     for j := 0 to 1023 do
  6.     begin
  7.       P^ := TracePixel((j-512)/512, (i-384)/512);
  8.       Inc(P);
  9.     end;
  10.   end;
  11.  
  12. end;
  13.  
  14. function TRaytracer.TracePixel(X, Y: Single): TRGBTriple;
  15. const
  16.   Pos: TVector3f = (0.0, 0.0, 4.0);
  17.   r = 1.0;
  18. var
  19.   Ray: TVector3f;
  20.   a, b, c, q, Disk, x1, x2: Single;
  21. begin
  22.   Ray[0] := X;
  23.   Ray[1] := Y;
  24.   Ray[2] := 1.0;
  25.  
  26.   a := Scalar(Ray, Ray);
  27.   b := -2*Scalar(Ray, Pos);
  28.   c := Scalar(Pos, Pos)-Sqr(r);
  29.  
  30.   Disk := Sqr(b)-4*a*c;
  31.   if Disk >= 0 then
  32.   begin
  33.     Disk := Sqrt(Disk);
  34.     q := -0.5*(b+psgn(b)*Disk);
  35.     x1 := q/a;
  36.     x2 := c/q;
  37.     if x2 < x1 then
  38.       x1 := x2;
  39.     Result := RGB(Trunc(16*x1), Trunc(16*x1), Trunc(16*x1));
  40.   end
  41.   else
  42.     Result := RGB(0, 0, 0);
  43. end;


Das macht eigentlich genau das, was es soll, nämlich eine Kugel in Graustufen in der Mitte eines 1024x768 Bitmaps auszugeben. Die Ausgabe erspar ich euch einfach mal, die kann sich wohl jeder vorstellen.
Das ganze dauert in dieser Fassung bei mir (A64/3500+) etwa 110ms (mit Double 160ms), erlaubt also etwa 9 FPS. Ihr ahnt vielleicht schon, worauf ich hinaus will:

Ich hab mir dann mal eine Art Raytracing-Interface für OpenGL gebastelt; zunächst erstelle ich eine 32-bit-Bitmap:
Code:
  1. bmp.Width := 1024;
  2.     bmp.Height := 768;
  3.     bmp.PixelFormat := pf32bit;
  4.     for i := 0 to bmp.Height-1 do
  5.     begin
  6.       P := bmp.ScanLine[i];
  7.       for j := 0 to bmp.Width-1 do
  8.       begin
  9.  
  10.         X := j;
  11.         Y := i;
  12.  
  13.         P^.rgbBlue := X div 256;
  14.         P^.rgbGreen := X mod 256;
  15.         P^.rgbRed := Y div 256;
  16.         P^.rgbReserved := Y mod 256;
  17.  
  18.         Inc(P);
  19.       end;
  20.     end;
  21.     bmp.SaveToFile(ToF);


Selbige wird auf ein Quad geklebt, das in einer Displaylist gezeichnet wird:
Code:
  1. fList := glGenLists(1);
  2.   glNewList(fList, GL_COMPILE);
  3.  
  4.     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.     glClearColor(0, 0, 0, 0);
  6.     glDisable(GL_DEPTH_TEST);
  7.     glEnable(GL_TEXTURE_2D);
  8.  
  9.     fShd.Activate('std');
  10.  
  11.     glMatrixMode(GL_PROJECTION);
  12.       glLoadIdentity;
  13.       gluOrtho2D(1, 1, 1, 1);
  14.     glMatrixMode(GL_MODELVIEW);
  15.       glLoadIdentity;
  16.  
  17.       fTex.Bind('direction');
  18.       glBegin(GL_QUADS);
  19.         glTexCoord2i(0, 0);
  20.         glVertex3f(-1, -1, 0);
  21.         glTexCoord2i(1, 0);
  22.         glVertex3f(+1, -1, 0);
  23.         glTexCoord2i(1, 1);
  24.         glVertex3f(+1, +1, 0);
  25.         glTexCoord2i(0, 1);
  26.         glVertex3f(-1, +1, 0);
  27.       glEnd;
  28.  
  29.   glEndList;


Beim Zeichnen wird selbige Liste dann einfach nur noch gecallt und der Buffer gewechselt. Der Shader, der durch fShd aktiviert wird, macht im Vertexteil nur ftransform(); und leitet die TexCoords weiter (was man sich wahrscheinlich auch sparen könnte).
Der Fragmentshader erledigt nun das hier:
Code:
  1. uniform sampler2D genSamp;
  2.  
  3. float psgn(float x)
  4. {
  5.     if(x < 0.0)
  6.         return -1.0;
  7.     else
  8.         return 1.0;
  9. }
  10.  
  11. void main()
  12. {
  13.     vec4 Raydata = texture2D(genSamp, vec2(gl_TexCoord[0]));
  14.     vec3 Ray = vec3( (Raydata.b*256.0+Raydata.g)*0.5-1.0,
  15.                      (Raydata.r*256.0+Raydata.a)*0.5-0.75,
  16.                      1.0
  17.                     );
  18.    
  19.     vec3 Pos = vec3(0.0, 0.0, 4.0);
  20.     float r = 1.0;
  21.    
  22.     float a = dot(Ray, Ray);
  23.     float b = -2.0*dot(Ray, Pos);
  24.     float c = dot(Pos, Pos)-(r*r);
  25.    
  26.     float disk = b*b-4.0*a*c;
  27.    
  28.     if(disk < 0.0)
  29.         discard;
  30.     else
  31.     {
  32.         disk = sqrt(disk);
  33.         float q = -0.5*(b+psgn(b)*disk);
  34.         float x1 = q/a;
  35.         float x2 = c/q;
  36.         if(x2 < x1)
  37.             x1 = x2;
  38.            
  39.         gl_FragColor = vec4(x1/16.0, x1/16.0, x1/16.0, 0.0);
  40.     }
  41.    
  42. }


Das Bild ist fast das gleiche, nur aus irgendeinem Grund ist alles ein paar Pixel nach links oben verschoben. Nun aber das sagenhafte Ergebnis auf meiner GF7900GT 512/AGP: 800 FPS, also etwa das 90fache...
Wenn GF7er-Grafikkarten bereits ohne SLI so optimiert sind, wäre es dann beim Ottonormal-Tracer performancetechnisch nicht wesentlich günstiger, auf der Grafikkarte zu raytracen? Oder hab ich hier irgendeinen Denkfehler? ;)
(Und sieht jemand den Grund, warum das GPU-Bild sich unterscheidet? ;))

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 15, 2007 22:36 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
die sache mit den grafikkarten ist, daß diese sowas 24x Parallel (und mehr - kenne mich bei neuen karten nicht mehr aus) rechnen können und ausserdem Vektoreinheiten bestehen, die auch noch die geometrie schneller berechnen können. Insofern sind sie verlässlich schneller, als eine standard CPU im ein-thread modus. Also wen wunderts, daß ein entsprechend optimierter Grafikprozessor schneller bei sowas ist, als ein All Purpose Prozessor? Spannend wird es aber bei entsprechend fortschrittlichen techniken - die lassen sich dann irgendwann verlässlich nicht mehr allein auf der karte durchrechnen - man teilt dann die last zwischen den prozessorarten auf - grafikkarte darf die langweiligen aber leicht parallelisierbaren sachen machen und die CPU die etwas anspruchsvolleren (sortieren, aufbereiten der daten für die karte, usw.).. Das klappt aber auch nicht bei allen darzustellenden Objekten gut. Ganz einfache analytische und besonders Polygone sind die metierts der Grafikkarte - kompliziertere analytische, wie etwa der blobtree (siehe projektthread) wehren sich mehr oder weniger erfolgreich gegen den einsatz von grafikkarten... Kommt halt immer drauf an, was das ziel des tracers ist, wie portabel und flexibel er sein muss, usw.. Es gibt da verschiedene Mischformen, etwa vekorPU+CPU/GPU+CPU/CPU/ raytracer... Alles da, je nach hardware, anforderungen und leidensdrang des entwicklers ;-) Und mein tracer ist z.B. lahm bei einfachen bildern, bei globaler beleuchtung ist er aber gar nicht mal soo schlecht dabei... kommt halt immer drauf an, was herauskommt. und grad wenn man seinen ersten tracer schreibt, weis man nicht wohin es sich entwickelt - konnte ich anfangs gar nicht abschätzen, daß er irgendwann globale beleuchtung rechen können sollte, und es war auch nicht geplant... es hat sich halt so entwickelt und ich hab zufällig eine webiste darüber entdeckt und mir gedacht, das will ich auch können - und dann hab ichs halt implementiert ;-) und da ist dann der tracer auf der CPU etwas überlegen, weil man da leichter drauf anpassen kann. hat man mehr erfahrung, ist die richtige mischung im aufteilen auf die verfügbaren prozessorarten sicher keine schlechte sache.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » DGL » Feedback


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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 | 16 Queries | GZIP : On ]