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:
glBegin (GL_TRIANGLESTRIP);
.
.
.
glend;
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).
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.
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.
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.
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.
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?
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.
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.
die Berechnung sollte deutlich schneller (und übersichtlicher) gehn mit
Code:
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)
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.