Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 15.02.2004, 19:16 Titel: |
|
|
Ich weiß nicht, ob du was mit OpenGL Code anfangen kannst. Hier :
Code: |
class cLightLayer: public cLayer
{
private:
std::list<cStaticLight*> m_statics;
std::list<cDynamicLight*> m_dynamics;
cDynamicImage* m_image;
public:
cLightLayer()
{
m_image = new cDynamicImage( );
}
virtual ~cLightLayer(){};
void Initialize()
{
//Erzeuge eine Textur 512x512 mit 4Bytes Farbtiefe (RGBA)
m_image->Load( "512 512 4" );
}
// Wird aufgerufen, bevor die Szene gerendert wird
void PreRender()
{
// Sichere den vorherigen Blend Mode
graphics::SaveBlendMode();
//Render die Texturen aller dynamischen Lichter
std::list<cDynamicLight*>::iterator diter;
for( diter=m_dynamics.begin(); diter!=m_dynamics.end(); ++diter )
{
// PreRender rendert die Textur für das jeweilige licht.
(*diter)->PreRender();
}
//Setze Blend Mode auf Additive Color glBlendFunc( GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR );
graphics::SetBlendMode( graphics::AdditiveColor );
//Starte das Rendern in die textur
m_image->BeginRender();
// Fülle die Textur mit dem Ambient Light
graphics::SetClearColor( ambient );
graphics::ClearBuffer();
// Gehe dich alle dynamischen und statischen lichter und lasse diese Rendern
std::list<cStaticLight*>::iterator siter;
for( siter=m_statics.begin(); siter!=m_statics.end(); ++siter )
{
(*siter)->Render();
}
for( diter=m_dynamics.begin(); diter!=m_dynamics.end(); ++diter )
{
(*diter)->Render();
}
//Speicher die textur
m_image->EndRender();
// Setze alle werte zurück
graphics::RestoreBlendMode();
graphics::SetClearColor( cColor( 0, 0, 0 ) );
graphics::ClearBuffer();
}
// wird aufgerufen, nachdem der beleuchtete Teil der Szene gerendert wurde
void Render()
{
graphics::SaveBlendMode();
// Setze Blend mode auf Multiply Color glBlendFunc( GL_DST_COLOR, GL_ZERO );
graphics::SetBlendMode( graphics::MultiplyColor );
// Zeichne die gespeicherte Textur über den ganzen Bildschirm
m_image->DrawPosWH( 0, 0, 1280, 960 );
graphics::RestoreBlendMode();
}
|
Ich hoffe du kannst etwas damit anfangen. Viel OpenGL ist ja nicht drin, weil der meiste code gewrapped ist.
Viel mehr code kann ich dir nicht anbieten, weil das glaube ich den Rahmen hier ein wenig sprengen würde. Da ich das ganze in eine art Layer System eingebaut habe. |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.02.2004, 19:55 Titel: |
|
|
Also, wenn ich das richtig verstanden habe:
- m_image ist eine textur, wo die lightmaps draufgerendert werden
(warum ist die 512x512 groß, wenn doch die auflösung 1280x960 is, wie man am ende sieht?)
- bei (*sinter)->render() werden die lightmaps mit additive (was vorher eingestellt wurde) auf diese textur gerendert
- und am schluss die ganze textur auf den bildschirm mit multiply |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.02.2004, 20:06 Titel: |
|
|
Die Auflösung ist so gewählt weil die Texturen nicht eine so ungewöhnliche Grösse gemacht werden sollten (2^n) _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 15.02.2004, 20:28 Titel: |
|
|
Fallen Angel hat recht. Außerdem kann man der armen grafikkarte auch nicht so viele hochauflösende texturen zumuten.
vor allem nicht, wenn man die vorher noch rendert. außerdem sieht man sowieso im endeffekt keinen unterschied ob 512x512 oder 1024x1024.
man kann sogar auf 256x256 runter gehen. |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 15.02.2004, 20:41 Titel: |
|
|
also wird diese textur dann auf die bildschirmgröße skaliert... an welche positionen werden denn dann die lichter gerendert? |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 15.02.2004, 20:51 Titel: |
|
|
das ist in opengl recht praktisch:
Die Projektionsmatrix bleibt gleich.
nur der viewport, also die ausgabegröße verändert sich.
Das heißt, ich brauche gar nicht die koordinaten ändern.
Wenn ich die textur danach wieder auf den ganzen bildschirm skaliere, dann ist alles wieder am rechten platz
Ich habe egal bei welcher auflösung immer ein konstantes koordinatensystem von 1280x960.
das bild wird dann nur bei geringer auflösung etwas verschwommener, aber sonst ist alles gleich groß. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.02.2004, 20:52 Titel: |
|
|
Die Texturen werden dann dahin gesetzt wo sie auch hinkommen sollten eben vieleicht nur etwas in blockform also gröber. Wenn man auf diese Grösse rendert dann werden dann alle Renderoutputpositionen angepasst. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 16.02.2004, 11:52 Titel: |
|
|
Noch ne frage: wie stell ich denn Additive oder Multiply rendern für D3DXSPRITE bei d3d9 ein? |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 17.02.2004, 14:26 Titel: |
|
|
Weiß das denn keiner? |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.02.2004, 14:58 Titel: |
|
|
Mit SetRenderState _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 17.02.2004, 17:07 Titel: |
|
|
danke ..
und die Parameter? ich hab mal in der MSDN geguckt, aba net ganz verstanden, von wegen (1, 1, 1, 1) oder (1-A, 1-A, 1-A, 1-A) oder so |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.02.2004, 17:17 Titel: |
|
|
1 ist der maximale Farbwert zum Beispiel 255
aus (1,1,1,1) würde RGBA->(255,255,255,255)
also das maximale*den Wert
1-A würde bedeuten das vom Farbwert der Alphawert abgezogen wird. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
=]Mid[=]Night[= Super JLI'ler

Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 17.02.2004, 20:31 Titel: |
|
|
Jaaaa, aber wie bekomm ich denn z.B. Additive oder Multiply? |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 18.02.2004, 12:47 Titel: |
|
|
Da kann ich dir leider auch nicht helfen :/. Vielleicht weiß das Google Orakel etwas  |
|
Nach oben |
|
 |
|