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

Aktuelle Zeit: Fr Jul 18, 2025 08:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen über Dreiecke ziehen?
BeitragVerfasst: Do Aug 11, 2005 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hallo,

vielen Dank für Euere bisherigen Antworten. Die meisten haben mich immer ein gutes Stück weiter gebracht.

Leider habe ich immer noch Fragen. Meine jetzige ist hoffentlich recht einfach zu beantworten.

Ich habe mir mit

Code:
  1.  
  2. glBegin (GL_TRIANGLESTRIP);
  3.    .
  4.    .
  5.    .
  6. glend;
  7.  


einen Zylinder gebaut. Das geht zwar auch mit gluCylinder, aber meiner sollte besondere Eigenschaften haben. Nun habe ich das Problem mit den Texturen. Wenn ich die Textur an das Objekt binde, wird die Textur auf jedes Dreieck einzeln aufgetragen. Ich möchte aber, dass die Textur, wie bei gluCylinder, nur einmal erscheint (Wenn Stacks = 1 ist).

Kann mir da jemand helfen?

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 11:29 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Deine Textur hat die größe von (1,1), jetzt weisst du aus wievielen Flächen( Aus Dreiecken zusammengesetzt ) dein Zylinder haben soll. Jetzt Teilst du die Größe 1 durch die Anzahl der Flächen. Sprich Variable S = 1/(AnzahlderKanten), jetzt fängst du bei Kante 0 an:
glTexCord(0,(KanteX*S)) wobei es auch die Kante 0 gibt!

Hoffe es ist von den Befehlen richtig, das was noch Sinnvoll ist ist Runden!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Speedmaster hat geschrieben:
Hoffe es ist von den Befehlen richtig, das was noch Sinnvoll ist ist Runden!

Fast. glTexCoord2f wäre der gewünschte gesprächspartner gewesen. Aber es lebe die Codevervollständigung von Delphi. ;-)

Aber ich verstehe nicht warum man runden sollte? Bzw verstehe ich nicht wie du das meinst. Gerundet wird normal nur auf ganze Zahlen und dann könntest du die Berechnung auch lassen. Dann würde nämlich entweder 0 oder 1 raus kommen. Was das ursprüngliche richtige Ergebnis falsch machen würde.
Also nicht runden. OpenGL sucht sich das schon selber raus.

PS: @Andy: Immer raus mit deinen Fragen. Dafür sind wir ja schließlich da. Sonst würde wir das ja nicht machen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 12:09 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Lossy eX hat geschrieben:
Speedmaster hat geschrieben:
Hoffe es ist von den Befehlen richtig, das was noch Sinnvoll ist ist Runden!

Fast. glTexCoord2f wäre der gewünschte gesprächspartner gewesen. Aber es lebe die Codevervollständigung von Delphi. ;-)

Aber ich verstehe nicht warum man runden sollte? Bzw verstehe ich nicht wie du das meinst. Gerundet wird normal nur auf ganze Zahlen und dann könntest du die Berechnung auch lassen. Dann würde nämlich entweder 0 oder 1 raus kommen. Was das ursprüngliche richtige Ergebnis falsch machen würde.
Also nicht runden. OpenGL sucht sich das schon selber raus.

PS: @Andy: Immer raus mit deinen Fragen. Dafür sind wir ja schließlich da. Sonst würde wir das ja nicht machen. ;-)


Liegt nur daran das ich eben nichts mit OpenGL mache, da ich wie im OT Forum geschrieben auf eine Spezielle Schule gehe und die dort nur mit DX Arbeiten, und ich mich im Moment in C# und DX rumärgere( Zumindestens mit DX ).

Habe vergessen zu erwähnen das man doch auf 2 - 4 Kommastellen runden soll!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Womit würdest du das denn machen?

Aber ich persönlich sehe da nicht wirklich viel sinn drin, wenn ich ehrlich bin. Eher im gegenteil. Im Endeffekt benutzt man ja einen Single und dadurch ist die Maximalgenauigkeit ja schon festgelegt. Speicherplatzspart man dadurch ja auch noch nicht. Beim Rechnen macht es ja keinen Unterschied welche Zahl sich im Single befindet es wird eh komplett damit gerechnet. Das einzige was man dadurch bekommt wären halt Stauchungen und Streckungen des darzustellenden Bereiches, wodurch je nach Rundung und Texturgröße in einem vermeindlich gleichem Bereich auf dem Bildschirm mal mehr oder weniger Pixel der Textur verwendet werde. Das ist zugegeben Maßen ziemlich gering, aber dennoch sind sie da. Und je nach gleichbleibenden Muster der Textur könnte ich mir vorstellen, dass die schon auffallen. Also unter Idealbedingen versteht sich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hört sich gut an. Eines möchte ich aber noch genau wissen.
Ihr sprecht von "Kanten". Ein Dreieck hat meines Wissens aus drei "Kanten". Soll ich also pro "umkantete" Fläche den Zähler aufaddieren oder pro "Kante", also drei pro Fläche?

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 12:35 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
AndyH hat geschrieben:
Hört sich gut an. Eines möchte ich aber noch genau wissen.
Ihr sprecht von "Kanten". Ein Dreieck hat meines Wissens aus drei "Kanten". Soll ich also pro "umkantete" Fläche den Zähler aufaddieren oder pro "Kante", also drei pro Fläche?

Danke


>>Hier<< mal ein Zylinder ausgerollt, die Fläche M(Mantel) wird in X verschiedene Quadrate eingeteilt, jedes dieser Quadrate hat 2 Kanten die zu den Nachbarn anschließen, wobei die Kanten natürlich nur einmal gezählt werden. Die Quadrate wiederum setzen sich aus 2 Dreiecken zusammen, die Kanten der Dreiecke werden aber nicht gezählt, genauso wie die die den Deckel berühren!

Hoffe das Hilft weiter!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 12, 2005 07:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Danke, das sieht jetzt super aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 13, 2005 20:55 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Schön wärs, wenn du für andere Anfänger deinen Code posten könntest. Sicherlich wirst du nicht der letzte sein, den das interessiert. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 15, 2005 03:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Hier ist also meine Zylinderfunktion:

Code:
  1.  
  2. type
  3.   TGLVector = packed record
  4.     x,y,z: GLfloat;
  5.   end;
  6.  
  7. function SubtractVector (Vec1, Vec2: TGLVector): TGLVector;
  8. // subtrahiert Vec2 von vec1 und gibt das ergebnis in vec3 zurück
  9. var
  10.   Vec3: TGLVector;
  11. begin
  12.   Vec3 .X := Vec1.X - Vec2.X;
  13.   Vec3 .Y := Vec1.Y - Vec2.Y;
  14.   Vec3 .Z := Vec1.Z - Vec2.Z;
  15.   result := Vec3;
  16. end;
  17.  
  18. function Magnitude(V1 : TGLVector) : GLfloat;
  19. var
  20.   Ergebnis: GLdouble;
  21. begin
  22.   // gibt die länge des vektors zurück
  23.   Ergebnis := Power(V1.X,2)+Power(V1.Y,2)+Power(V1.Z,2);
  24.   try
  25.     result := sqrt(Ergebnis);
  26.   except
  27.     result := 0;
  28.   end;
  29. end;
  30.  
  31. function MyCone (Start, Ende: TGLVector;
  32.                  RadiusStart, RadiusEnde: TGLfloat;
  33.                  Slices: Integer): boolean;
  34. var
  35.   Slice: Integer;
  36.   Laenge, xdelta, zdelta: TGLfloat;
  37.   V1, V2, V3, V4, Normale: TGLvector;
  38.   A, B: Single;
  39.   tmpVec: TGLvector;
  40. begin
  41.   result := true;
  42.   // laenge des kegels berechnen
  43.   // hierbei wird davon ausgegangen, dass der kegel senkrecht steht, parallel zur Y-Achse
  44.   tmpVec := SubtractVector (Start, Ende);  // zieht ende von start ab
  45.   Laenge := Magnitude (tmpVec);              // berechnet die länge von tmpVec
  46.   // radiusdifferenz berechnen                   // obere und untere fläche stehen im mittelpunkt nicht übereinander
  47.   xdelta := Start.x - Ende.x;
  48.   zdelta := Start.z - Ende.z;
  49.   xdelta := -xdelta;
  50.   glBegin (GL_TRIANGLE_STRIP);
  51.   // der kegel wird entlang der z-achse gezeichnet
  52.   V1.z := 0;                                             // punkt 1 untere scheibe
  53.   V2.z := 0;                                             // punkt 2 untere scheibe
  54.   V3.z := Laenge;                                    // punkt 1 obere scheibe
  55.   V4.z := Laenge;                                    // punkt 2 obere scheibe
  56.   for Slice := 1 to Slices do begin
  57.     A := 2 * PI * Slice / Slices;
  58.     B := 2 * PI * (Slice+1) / Slices;
  59.     V1.x := sin(A)*RadiusStart;
  60.     V1.y := cos(A)*RadiusStart;
  61.     V2.x := sin(B)*RadiusStart;
  62.     V2.y := cos(B)*RadiusStart;
  63.     // umsetzung von y nach z-achse, weil der zylinder entlang der Y-Achse erwartet
  64.     // wird, aber um die Z-Achse konstruiert wird.
  65.     V3.x := (sin(B)*RadiusEnde)+xdelta;
  66.     V3.y := (cos(B)*RadiusEnde)+zdelta;
  67.     V4.x := (sin(A)*RadiusEnde)+xdelta;
  68.     V4.y := (cos(A)*RadiusEnde)+zdelta;
  69.     if Slice = 1 then
  70.     begin
  71.       glTexCoord2f(1,0); glVertex3fv(@V1);
  72.       glTexCoord2f(1,1); glVertex3fv(@V4);
  73.       glTexCoord2f(1-Slice/Slices,0); glVertex3fv(@V2);
  74.       glTexCoord2f(1-Slice/Slices,1); glVertex3fv(@V3);
  75.     end
  76.     else
  77.     begin
  78.       glTexCoord2f(1-Slice/Slices,0); glVertex3fv(@V2);
  79.       glTexCoord2f(1-Slice/Slices,1); glVertex3fv(@V3);
  80.     end;
  81.   end;
  82.   glEnd;  // (GL_TRIANGLE_STRIP)
  83. end;
  84.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 15, 2005 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe es nicht ausprobiert aber der Code sieht recht gut aus. Mir sind aber noch einb paar Kleinigkeiten aufgefallen die man evtl. verbessern könnte um auch noch das letzte bisschen Geschwindigkeit herraus zu holen.

Fang ich mal oben an.

packed record
Packed ist ein Zusatz der eigentlich nur dann wirklich gebraucht wird, wenn man Rekords in Dateien oder als Pointer auf Speicherbereiche benutzen will. Delphi versucht sonst das Rekord so auszurüchten, dass deren Grße durch 1, 2, 4 oder 8 Bytes teilbar ist. Um schneller damit arbeiten zu können. Mit Packed kann es durchaus sein, dass der Zugriff darauf wenig langsamer wird. In deinem Fall (2-3 Reckords) dürfte das praktisch nicht der Fall sein. Aber das nur am Rande.

SubtractVector (Vec1, Vec2: TGLVector): TGLVector;
An dieser Stelle geschiet folgendes. Delphi legt eine Kopie von deinem Rekord an und übergibt dieses dann an deine Methode. Das könnte man unterbinden in du "const Vec1, Vec2: TGLVector" schreibst. Dann übergibt delphi nicht 2x die Records sondern lediglich deren Pointer. Es muss auch kein Speicher mehr kopiert werden. Wenn man die Methoden sehr häufig aufruft kann es schon zu einem gut messbaren Overhead kommen. Evtl kann man das auch mit dem Rückgabewert so machen. Der wird normal auch so übergeben. Bin mir aber nicht 100%tig sicher ob der auch kopiert wird. Müsste aber eigentlich. Dann aber entsprechend var benutzen damit man es auch verändern darf. Aber Rückgabewerte als zusätzliche Parameter sind häufig auch einfach nur unpraktisch.

V3.x := (sin(B)*RadiusEnde)+xdelta;
"sin(B)*RadiusEnde" hattest du ja bereits bei V2 berechnet. Da da die Ergebniss noch genau so drin Stecken, könnte man sich ja daraus bedienen.
1-Slice/Slices wird ja auch mehrmals benutzt. Wenn man das Ergebniss zwischenspeichert könnte man sich pro Durchgang eine Berechnung sparen. Aber ich denke mal, dass das wahrlich nicht so sonderlich ins Gewicht fallen sollte.
Bei den Slices könnte man es auch so machen, dass man sich die Breite eines Slice ausrechnet und es am Anfang eines jeden Durchganges lediglich addiert. So kann man zum Bleistifft auch die Berechnung vereinfachen.

Aber ich glaube ich bin mal wieder in ein extrem abgerutscht. Zu mindest mit dem letzten Teil. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 15, 2005 13:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
mach ich mal weiter mit performanceratschlägen ;)
Code:
  1. Ergebnis := Power(V1.X,2)+Power(V1.Y,2)+Power(V1.Z,2);

die Berechnung sollte deutlich schneller (und übersichtlicher) gehn mit
Code:
  1. Ergebnis := sqr(V1.X)+sqr(V1.Y)+sqr(V1.Z)


die sinus und cosinus werte sollte amöglichst pro Winkel nur einmal mit der prozedur sincos berechnet werden und dann eingesetzt, da sin und cos sehr langsam im vergleich sind (sincos ist fast doppelt so schnell wie sinus und cosinus einzeln)


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


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