Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

14.07.2004, 14:38

Bumpmapping mit DX TextureStage States

Hallo,

ich habe versucht, Bumpmapping zu aktivieren, indem ich alle States so gesetzt habe, wie es auch in der SDK beschrieben ist - ich habe also 3 Maps, eine für Diffuse , eine Bump bzw. Normalmap und eine dritte für Specular Lighting. Folgende States setze ich vor dem Rendern, ist soweit fast wie aus der SDK Doku:

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
46
47
48
49
50
51
// Texturen setzen
hResult = m_pD3DDevice->SetTexture(0, pRenderset->getTextureDiffuse());
hResult = m_pD3DDevice->SetTexture(1, pRenderset->getTextureBump());
hResult = m_pD3DDevice->SetTexture(2, pRenderset->getTextureSpecular());


// Set the color operations and arguments to prepare for
//   bump mapping.

// Stage 0: The base texture
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
hResult = m_pD3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );

// Stage 1: The bump map - Use luminance for this example.

hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );

// Stage 2: A specular environment map

hResult = m_pD3DDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
hResult = m_pD3DDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
hResult = m_pD3DDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
hResult = m_pD3DDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );

// Set the bump mapping matrix.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, float2DW(1.0f) );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, float2DW(0.0f) );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, float2DW(0.0f) );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, float2DW(1.0f) );


// Set luminance controls. This is only needed when using
// a bump map that contains luminance, and when the 
// D3DTOP_BUMPENVMAPLUMINANCE texture blending operation is
// being used.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }

hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, float2DW(0.5f) );
hResult = m_pD3DDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, float2DW(0.0f) );


Ich habe zuvor noch mit

Quellcode

1
2
3
hResult = m_pD3DDevice->SetTexture(0, getTextureDiffuse());
hResult = m_pD3DDevice->SetTexture(1, getTextureBump());
hResult = m_pD3DDevice->SetTexture(2, getTextureSpecular());


alle 3 Texturen geladen und gesetzt. Überall, auch beim obigen Codeabschnitt, sind die hResults OK. Mein Vertex Format sieht so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
struct SVertex
{
    CVector vPos;
    CVector vNormal;
    DWORD       dwColor;
    CVector2D   vTexPos;
    CVector2D   vTexPos2;
    CVector2D   vTexPos3;
};

#define ENGINE_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEX2 | D3DFVF_TEX3)


Ich weiß gar nicht ob "D3DFVF_TEX2" und "D3DFVF_TEX3" überhaupt nötig ist hier.

Nunja wenn ich das alles mal laufen lasse, dann sehe ich mein Beispiel-Objekt, korrekt Texturiert, ich hab auch ne Lichtquelle die als Test um das Objekt "fliegt", aber keine Spur von Bumpmapping (und auch keine Spur vom Specular Mapping). Damit ich sicher sein kann, dass die Texturen auch korrekt sind, habe ich als Test mal 3 Texturen (Diffuse, Normal und Specular) aus einem kommerziellen Spiel genommen, aber ohne Erfolg.

Habe ich noch irgendwas vergessen? Muss ich irgendwelche States setzen, oder was anderes, damit das Bump Mapping funktioniert?


Vielen Dank für Eure Hilfe!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.07.2004, 14:45

bei deinem bumpmapping prob. kann ich dir nicht wirklich helfen, aber

C-/C++-Quelltext

1
#define ENGINE_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3)


sollte reichen

Anonymous

unregistriert

3

14.07.2004, 15:35

Ok danke dot

Ich hoffe jemand kann sich auch noch vorstellen, warum das Bumpmapping nicht gehen will...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

14.07.2004, 17:11

Deaktivier mal evnMapping in dem Beispiel und dann weißt du wo dein Fehler liegt....

Anonymous

unregistriert

5

14.07.2004, 18:56

Zitat


Deaktivier mal evnMapping in dem Beispiel und dann weißt du wo dein Fehler liegt....


Meinst Du damit das

Quellcode

1
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);


in

Quellcode

1
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3);


ändern? Falls Du das so gemeint hast, muss ich leider sagen, dass das nicht geht. Mein Model ist nun total hell, fast weiß, ansonsten hat sich dadurch nichts geändert :-/
Muss ich dann die

Quellcode

1
SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, qCUtils::float2DW(1.0f) );


auch rauslassen, weil sich ja D3DTSS_BUMPENVMAT00 auch sehr nach enviroment Bumpmap anhört..


Danke für Deine Hilfe!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.07.2004, 21:25

C-/C++-Quelltext

1
SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3);


afaik aktivierst du damit Normalmapping...

Anonymous

unregistriert

7

14.07.2004, 22:02

Jo, aber ist Normalmapping nicht genau das was ich will? Ich habe eine Bump-Map, also eine Normalmap aus RGB Werten, und die Normalvektoren sind dort in den RGB Werten kodiert. Daraus möchte ich jetzt das Bumpmapping Verfahren haben... aber irgendwie klappt es einfach nicht :(

@Nox:
Du scheinst ja zu wissen wo der Fehler liegt, oder? Könntest Du mir nicht ein wenig auf die Sprünge helfen?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

14.07.2004, 23:45

Also jetzt droßeln wird das ganze mal wieder auseinander.(ich habe ewig dafür gebraucht)
Es gibt den Begriff Bumpmapping, aber jeder scheind damit eine andere Technik zu verbinden.

1.Es gibt das Env-Bumpmapping. Das sorgt dafür das die umgebung sich realistisch spiegelt.(daher solltest du env mal ausschalten, denn du hast keine gesetzt)

2.Es gibt die Bumpmapping-Beleuchtung(DOT3). Diese Technik wird von doom3 oder auch von X2 benutzen. Dabei wird aus einer höhenmap eine Normal-map errechnet und diese wird dann "per pixel" mit dem vorhanden verrechnet.

Beide techniken sind dazu da um mit low-polys möglichst res-sparend realistische Bilder zu erzeugen, denn beide machen feine konturen "sichtbar".

Bei genaueren fragen oder einwenden(die garantiert richtig sind ;D )´mich bitte niedermachen.........

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.07.2004, 00:18

schau dir das DotProduct3 sample vom dx sdk an.
da is ganz gut beschrieben wie genau das geht was du willst...

Anonymous

unregistriert

10

15.07.2004, 01:28

@Nox:
Ja das ist alles klar, und es ist auch alles total korrekt, was Du geschrieben hast. Vergesst mal meinen Code oben, ich weiß auch nicht warum ich da Env. drin hatte. Also was ich will ist Bumpmapping mit der Dot3 - Methode, und zwar habe ich die Normalmap schon, brauche also keine Berechnungen aus einer Height Map oder sonstwas.


Ich habe mir das Dot3 Bumpmapping Programm aus dem SDK einmal angeschaut. Die arbeiten dort jedoch mit keiner normalen, also zusätzlichen Textur, sondern nur mit der Height - bzw. Normalmap. Ich habe bei mir aber 2 Texturen, einmal die ganz normale diffuse Map und einmal die fertige Normalmap. Ich dachte jetzt sollte es ja weiter nicht wirklich schwierig sein, das hinzubekommen :)

Mein aktueller Code der Renderstates:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
// Texturen setzen
m_pD3DDevice->SetTexture(0, pRenderset->getTextureDiffuse());   // Diffuse Map
m_pD3DDevice->SetTexture(1, pRenderset->getTextureBump());  // Normal Map

// Stage 0: Normale Textur
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );

// Stage 1: Normal Map per DOTPRODUCT3
m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3);
m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );


Ich lade die Normale, also diffuse Textur übrigens mit dem Format D3DFMT_UNKNOWN (es ist eine .tga Datei) und auch die Normal Map mit D3DFMT_UNKNOWN, ist das vielleicht der Fehler?

So funktioniert es jedenfalls nicht, so sieht es nämlich total dunkel aus, also da wo das Licht hinleuchtet ist es teilweise ein wenig hell, sieht jedenfalls total falsch aus :(

Danke für Eure Hilfe und Eure Geduld :)

Werbeanzeige