Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.08.2003, 13:40 Titel: |
|
|
Naja, ganz so schlimm ist es auch nicht. Am besten machst du eine Liste von Partikeln - sowas in der Art wirst du ja sowieso schon haben. Immer, wenn du einen neuen Partikel erzeugst, läufst du durch die Liste und schaust, wann ein z-Wert größer ist, als der des aktuellen Partikels. Wenn dies so ist, sortierst du ihn ein.
Hattest du es mal über den Colorkey probiert? Das könnte ev. gehen. |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 01.08.2003, 13:46 Titel: |
|
|
Das Problem ist ja, dass man sich um die Partikel herum bewegen kann, ich müsste also ständig umsortieren
Die Transparenz läuft momentan über den Colorkey, der ja eigentlich nichts anderes macht, als den Alphakanal der Colorkey-Farbe auf 0 zu setzen ... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.08.2003, 13:58 Titel: |
|
|
Ich hätte jetzt erwartet, dass der Colorkey ev. ein Flag und die Farbe setzt, so dass das Schreiben in den Z-Buffer ausgeschaltet wird.
Eigentlich muss du die Liste (wenn ich es richtig verstehe) von vorne nach hinten oder von hinten nach vorne rendern. |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:04 Titel: |
|
|
Das ist ja mein Problem, dass das mit der Liste nicht so einfach ist:
=]Mid[=]Night[= hat Folgendes geschrieben: | Das Problem ist ja, dass man sich um die Partikel herum bewegen kann, ich müsste also ständig umsortieren
|
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:11 Titel: |
|
|
Wieso? Angenommen du hast eine STL-Liste, dann kannst du mit
Code: |
std::list<CParticel*> it;
// vorwärts ausgeben:
for(it=ParticelList.begin();it!=ParticelList.end();it++)
{
(*it)->Render();
}
// rückwärts ausgeben:
for(it=ParticelList.end();it!=ParticelList.begin();it--)
{
(*it)->Render();
}
|
|
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:26 Titel: |
|
|
Also:
Die Partikel werden an Zufallspositionen innerhalb eines Blocks gesetzt.
Sie bewegen sich mit einem Vektor in eine Richtung, bis sie aus dem Block herausfallen. Dann werden Sie wieder an einen zufälligen Startpunkt gesetzt.
Wenn ich jetzt von einer Seite auf den Block gucke, muss ich die Partikel ja nicht nach der Reihenfolge, wie sie erstellt wurden (so befinden sie sich in einem Array) zeichnen, sondern nach ihrer Entfernung zur Kamera.
Wenn ich mich um den Block herumbewege, muss ich doch dauernd die Liste umsortieren. Beispiel:
Das wird bei 1000 Partikeln natürlich schwieriger :S |
|
Nach oben |
|
 |
Jörg JLI MVP


Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:43 Titel: |
|
|
Um die Partikel in der Reihenfolge der Entfernung zur Kamera zu sortieren, musst du einfach die Partikelposition von der Kameraposition abziehen und bspwse. mit D3DXVec3LengthSq(CamPos - ParticlePos) das Quadrat der Entfernung berechnen (du könntest auch D3DXVec3Length() benutzen, da diese Funktion jedoch mehr Zeit braucht als D3DXVec3LengthSq() und du eh nur das Entfernungsverhältnis und nicht die absolute Entfernung brauchst, würde ich D3DXVec3LengthSq() benutzen).
Das machst du für jedes Partikel sortierst nach der Entfernung zur Kamera.
Was du stattdessen noch probieren könntest, ist Alphatesting. Dabei schaltet D3D den ZBuffer automatisch ab, wenn ein Pixel transparent ist. Das könnte zu guten Ergebnissen führen, ohne dass du die Partikel sortieren musst. _________________ www.messiahzone.de.vu |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:51 Titel: |
|
|
ENDLICH EINE IDEE !!!!
WIE MACHE ICH ALPHATESTING ???????????
WARUM BIST DU NICHT SCHON FRÜHER IN DEN THREAD GEKOMMEN ???  |
|
Nach oben |
|
 |
Jörg JLI MVP


Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 01.08.2003, 14:55 Titel: |
|
|
Wie man Alpha Testing genau verwendet, steht z.B. in der DXSDK-Dokumentation unter "Alpha Testing State" bzw. gibt es sicher auch einige Tutorials im Internet. Ich selbst kann dir nicht so viel darüber erzählen, weil ich es selbst noch nie verwendet habe  _________________ www.messiahzone.de.vu |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 01.08.2003, 15:02 Titel: |
|
|
Ich muss jetzt weg, ich probiers auf jeden Fall mal aus und schreib ob es klappt |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 02.08.2003, 09:40 Titel: |
|
|
Also, es gibt eine Möglichkeit, mit der man Pixel mit bestimmten Alpha-Werten vom Kopieren ausschließen kann:
Code: |
m_lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
m_lpDevice->SetRenderState(D3DRS_ALPHATESTENABLE, 1);
// Der Referenzwert für den Alphakanal
m_lpDevice->SetRenderState(D3DRS_ALPHAREF, 0);
// D3DCMP_... gibt an, wie die Pixel mit dem Referenzwert verglichen werden sollen. Ist der Vergleich positiv, wird der Pixel gezeichnet.
m_lpDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
m_lpDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_lpDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
Mit diesem Code werden jetzt nur die Pixel mit Alphawert 0 vom Kopieren ausgeschlossen.
Der Effekt ist jetzt nicht mehr ganz so gravierend:
 |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.08.2003, 21:03 Titel: |
|
|
Du musst einfach nur die Partikelreihenfolge so ändern das die Partikel von forne nach hinten gemalt werden das ist auch schon alles. |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 11.08.2003, 21:19 Titel: |
|
|
Das war ja sein Problem, dass er aufgrund der unterschiedlichen Ansichtsperspektiven bei jedem Rendervorgang die Liste der Partikel umsortieren müsste, damit sie wieder in der Reihenfolge ist. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.08.2003, 21:32 Titel: |
|
|
Sorry hab total übersehen das das ganze über 3 Seiten ging. Hab nur die erste Seite bemerkt. |
|
Nach oben |
|
 |
|