Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Prism Texturierung ohne OpenGl/DirectX (https://www.delphipraxis.net/65273-texturierung-ohne-opengl-directx.html)

simlei 14. Mär 2006 14:13


Texturierung ohne OpenGl/DirectX
 
Hallo! Ich hab mir so ein kleines 3d-prog gebastelt
( http://simlei3.si.funpic.de/projects.html - Ansicht oder http://simlei3.si.funpic.de/Programm...jekt_beta2.rar - Download)
und da will ich Flächen darstellen - texturiert. wie man vielleicht sieht, ist dies alles "per Hand" berechnet, also nicht OpenGL oder sonst Renderer/3dBibliotheken/Beschleuniger genutzt. Und so such ich nach einer Funktion, die ein Bild - Bitmap - auf eine bestimmte Fläche staucht, sodass sozusagen ein Vieleck (ich sag jetzt mal nicht Polygon da das viele als Körper auffassen) mit einem Bild ausgefüllt ist, das wie alle Bilder rechteckig vorliegt, im Programm aber nicht über das Polygon hinausgeht, sondern auf es gestreckt ist.
Ich wär sehr dankbar wenn jemand eine Möglichkeit weiß, ich hab bisher versucht das Mathematisch zu lösen - hat nicht geklappt :wall: :pale: .
Danke schonmal!

JasonDX 14. Mär 2006 14:40

Re: Texturierung ohne OpenGl/DirectX
 
Du kannst ein Image in .NET ohne Probleme vergrößern und verkleinern. Diese gedreht darzustellen wird allerdings sehr problematisch. In dem Fall hast du 2 möglichkeiten:
1. Du greifst auf eine API zurück (entweder n OpenGL-Header für .NET oder Managed DirectX (zweiteres kann ich nur empfehlen)) Nachdem du davon absehn willst gibts noch die 2. Möglichkeit:
2. Du programmierst dir selbst sozusagen eine RenderingPipeline. Das wird allerdings sehr aufwändig, das kann ich dir versichern ;)

Wenn du dir eine Rendering Pipeline anguckst wirst du sehn, dass du da relativ viel zu tun ham wirst. Und nachdem du das alles auf der CPU machst (zumindest geh ich mal davon aus) kannst du dir auch sicher sein, dass das ganze ziemlich langsam wird ;)
Um aber auch etwas konstruktivität in meinen Beitrag zu bringen: Guck dir ne Rendering Pipeline an (auf MSDN.com gibts dazu relativ interessante Dinge) und schau, was du alles benötigst. Da siehst du dann auch, wie du das ganze Aufbauen kannst, und was alles erledigt werden muss, um ein texturiertes, gedrehtes Dreieck auf den Bildschirm zu rendern.

greetz
Mike

simlei 14. Mär 2006 15:55

Re: Texturierung ohne OpenGl/DirectX
 
Zitat:

Du kannst ein Image in .NET ohne Probleme vergrößern und verkleinern. Diese gedreht darzustellen wird allerdings sehr problematisch.
Ist schon erledigt das mit dem Drehen wie gesagt ist das alles schon berechnet - sieht man in dem Programm. Mein einziges Problem ist eben, auf ein definiertes Polygon (nämlich das schon gedrehte Dreieck/Viereck usw.) Ein viereckiges Bild so aufzubringen, dass es derartig linear gestreckt/gestaucht ... ist (aber nicht überall gleich, ich will also nicht dass wieder ein Rechteck entsteht sondern dass das gestauchte eben kongruent zu dem zu texturierenden Polygon ist).
Unter MSDN hab ich ehrlich gesagt nicht viel sinnvolles gefunden... ( :wiejetzt: )
Also wer noch Ideen, Gedankenanstöße o.a (Funktionen sind natürlich am besten) hat - her damit! :D Ich will sie ja auch selber schreiben und wie gesagt nicht OpenGL oder DX nutzen.

DGL-luke 14. Mär 2006 15:58

Re: Texturierung ohne OpenGl/DirectX
 
da würd ich die bounding box von dem polygon berechnen, rundrum clippen und dann da rein stretchen... geht mit .Net ja ganz easy, denke ich.

simlei 14. Mär 2006 16:38

Re: Texturierung ohne OpenGl/DirectX
 
bounding box = klar
clippen - wie genau meinst du das? ich will es nicht wegschneiden
und reinstretchen? wenn es zB ein Dreieck ist, wie will ich das machen? kannst du mir da die Funktion(en) nennen? danke

JasonDX 14. Mär 2006 17:07

Re: Texturierung ohne OpenGl/DirectX
 
Zitat:

Zitat von simlei
Unter MSDN hab ich ehrlich gesagt nicht viel sinnvolles gefunden... ( :wiejetzt: )

Sry, ich hab da mit der Genauigkeit wohl etwas gegeizt :oops: Was ich meinte war der beschriebene Ablauf, der Durchlaufen wird, wenn man ein Dreieck texturiert und gedreht darstellen will. Der is in den DirectX-Docus zu finden, wenn man nach Fixed Function Pipeline oder Rendering Pipeline sucht.
Ich glaube nicht, dass das .NET-Framework hier von sich aus Funktionen zum Texturieren von gedrehten Polygonen mitsich bringt. Deswegen: du hast n bisschen Arbeit vor dir.
Ich versuch mal etwas genauer zu erklären, was ich mit "Arbeit" meine:
Du hast bspw. ein Dreieck. Das simpelste (und afaik einzigste) geometrische Gebilde, mit dem man jegliche gemoetrische Form zusammensetzen kann.
Dieses Dreieck hat 3 Koordinaten. Diese entsprechen den 3 Eckpunkten, wo sie sich im 3Dimensionalen Raum befinden. Nun rechnest du diese Koordinaten in Abhängigkeit der Rotation des 3Ecks in 2D-Koordinaten um, damit du sie auf dem Bildschirm darstellen kannst. Das hast du ja schon geschafft :)
Jetzt kommt der Teil, der dir Schwierigkeiten Macht. Die Farbe von jedem Pixel, das sich innerhalb des 3Ecks befindet, muss nun berechnet werden. D.h. du musst erstmal rausfinden: Welche Pixel befinden sich innerhalb des 3ecks, und welche tun das nicht? Das wird wohl in einer Schleife geschehen müssen, in der du Pixel für Pixel abfragst. Performance-Schub wär dann zu erreichen, wenn du die zu überprüfenden Pixels optimierst, und bspw. nur von der "linkesten" Ecke des Dreiecks bis zur Ecke ganz rechts überprüfst, und nicht alle Pixel der Zeichenfläche. Wahrscheinlich gibts dafür noch ne performantere Möglichkeit, wüsste jetzt aber nicht, welche.
So, für jedes Pixel, das sich im 3eck befindet musst du rausfinden, an welcher Position im 3Eck es sich befindet. Anhand dieser Position kannst du dann ausrechnen, welcher Teil der Textur jetzt da gezeichnet werden muss. Um das rauszukriegen, brauchst du aber noch eins: Texturkoordinaten. Du musst logisch wissen, welche Ecke der Textur an welches Eck des Dreiecks kommt. Anhand der damit nun errechneten Position nimmst du das Bitmap und holst dir die Farbe an dieser Position. Damit weißt du dann, welche Farbe das Pixel hat und kannst es zeichnen.
Wie du siehst, es ist nicht gerade einfach, und absolut nicht performant. Aber ich hoffe trotzdem, dass dus hinkriegst, bin auf dein Ergebnis gespannt :)

greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz