Du bist nicht angemeldet.

Werbeanzeige

1

20.03.2004, 13:29

Lightmaps + D3D-Lichter

Hi,

Ich möchte in meiner Portal-Engine Lightmapping einbringen, ohne aber auf reguläre D3D9-Beleuchtung verzichten zu müssen. Leider habe ich jetzt ein Problem: Ohne D3D-Beleuchtung (D3DRS_LIGHTING=FALSE) funktioniert soweit alles, aber mit Beleuchtung ohne Lichtquelle (oder ohne Lichtquelle in reichweite), bleibt der Sektor schwarz. (Ist ja auch verständlich, kein Licht ist da => Schwarz).

Nun meine Frage: Wie kann ich es erreichen, dass die Lightmaps unabhängig von D3D-Lichtquellen gerendert werden??? Ich habe es schon mit Effekten versucht (2Passes, einmal Lighting=false + Texturen, das andere mal ohne Texturen, aber mit Lighting=true!!!), funktioniert aber leider nicht...

Hoffe auf Hilfe,

Danke,

Chrissi

2

20.03.2004, 18:18

Wenn du beide Systeme gleichzeitig verwenden willst, must du deine Vertice Sortieren. Und zwar nach nichtbeleuchtete (die mit Lightmaps) und einmal beleuchtete (die mit D3D beleuchtet werden). Beide Listen renderst du dann auch Seperat. Deine 2 Pass-Methode ist viel zu rechen Intensiv und schluckt die Vorteile der Lightmaps.

Das Problem ist, das wenn deine D3D Birne eine Taschenlampe sein soll und du dann auf ein Dreieck leuchtest das mit Lightmaps "beleuchtet" ist, sieht man keinen Effekt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

20.03.2004, 18:37

Hi,

Danke für die schnelle Antwort!!!

Ich glaube, ich mach es so. In jedem Sektor-Effekt gibt es 2 Passes. Einmal mit Texturen + Lightmaps und das andere mal ohne Texturen aber mit Lichtern. Generel rendere ich nur die mit der Lightmaps und optional wird dann noch der 2Pass gerendert.

Nur, mal ne ganz N00big Frage: Zweimal rendern?! Funktioniert das denn?! Wie welche Alpha-Blending-Einstellungen muss ich da nehmen A(Alt + Neu Addieren?!) ??? Ohne Alpha-Blending wird nämlich immer nur der zweite Pass angezeigt, der erste Pass (bzw, die Dreiecke des ersten Passes mit den dazugehörigen Einstellungen) verfallen. (Verständlicherweise!).

danke,

Cristopher

4

20.03.2004, 18:48

Alpha-Blending ist nicht nötig. Du must 1 beim 2Pass das Z-Testing ausschalten (ist ja überflüssig), dann must du einfach ganz normal so denken , als ob du alles auf einmal rendern würdest.

Du must also einfach die Texturen mit einander verknpüfen. Multipassing ist im Prinzip nach das selbe wie Multitexturing. Nur das Mutlitexturing mit einem Rendervorgang auskommt und beim Multipassing das gesamte Objekt mehrmals gerendert wird.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

5

22.03.2004, 08:25

Hi,

danke für die Antwort. ;)

Schuldigung, aber ich komme noch immer nicht dahinter. Z-Test deaktivieren heißt ja eigentlich nur ZEnable auf false setzen. leider funktioniert es so nicht:

(Hier mal ein Beispiel für Davids Effect-Tool, 2 Kap. Nr 13 oder so...)



Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
STRING  Description      = "Test";
STRING  TextureFilename1 = "Stone.jpg";
STRING  ModelFilename    = "Sphere.x";
TEXTURE Texture1;

TECHNIQUE T1
{
    PASS P1
    {
        // Das Material festlegen
        MaterialDiffuse  = {1.0f, 1.0f, 1.0f, 1.0f};
        MaterialAmbient  = {0.5f, 0.5f, 0.5f, 0.0f};
        MaterialSpecular = {0.0f, 0.0f, 1.0f, 0.0f};
        MaterialEmissive = {0.0f, 0.0f, 0.0f, 0.0f};
        MaterialPower    = 20.0f;

        // Ein Richtungslicht erstellen
        LightType[0]      = Directional;
        LightDiffuse[0]   = {1.0f, 1.0f, 1.0f};
        LightAmbient[0]   = {1.0f, 1.0f, 1.0f};
        LightSpecular[0]  = {1.0f, 1.0f, 1.0f};
        LightDirection[0] = {1.0f, -1.0f, 1.0f};
        LightEnable[0]    = True;

        // Glanzfarben einschalten
        lighting=true;
        SpecularEnable = True;

        // Textur setzen
        Texture[0] = NULL;
    }

    PASS P2
    {
        // Nicht in den Z-Buffer schreiben
        ZEnable = False;

        // Textur setzen
        lighting=false;
        Texture[0] = <Texture1>;

        // Z-Buffer reaktivieren
        ZEnable = True;
    }
}


Es wird imemr nur der zweite pass angezeigt, der erste verfällt!!!

Vielen Dank nochmals,

Cu,

Chrissi

6

22.03.2004, 12:26

Weil du nicht gesagt hast wie du deine Textur verbinden willst, mit den Werten die schon im Buffer stehen.

Du must ihm sagen das er die Werte nicht einfach überschreiben soll sondern, das er die alten mit den neuen Werten verechnen soll. Z.B. so:

Quellcode

1
2
3
 m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
m_pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
Mit D3DTA_CURRENT sagst du dem Device das er die Aktuelle Farbe an diesem Pixel nehmen soll statt der Textur. Dann sollte es auch klappen.

Wo ist deine Lightmap spezifiziert?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

7

26.03.2004, 14:21

Hi,

Ich checks immer noch nicht. Es geht einfach nicht. Ich nehme jetzt aber einfach nur additives Alphablending und das wars. ;) So funktioniert es (eigentlich). Probleme habe ich nur bei durchsichtigen Materialien, aber das kriege ich bestimmt auch hin.

Nochmals vielen Dank,

Chrissi

PS: Bist du Informatikstudent oder schon Programmierer von Beruf?

8

26.03.2004, 16:05

:pi_blush: Sorry hab mich da verhagelt :angel:

Hab noch mal in der SDK nachgeschaut, die Texture Stage States werden normal gesetzt und beim zweiten mal werden die Blend Faktoren SRCBLEND und DESTBLEND gesetzt. Und natürlich das Blending Aktivieren ;D


*BIG SORRY* :pi_blush: :jojo:
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige