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

WhiteMike

Alter Hase

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

11

02.04.2009, 20:51

Zitat von »"TrikkieMikkie"«

Wer hat vergessen, das Licht einzuschalten? ;)


Die Schweizer! :-D

Mit freundlichen Grüßen,
WhiteMike

12

02.04.2009, 21:06

so sehen licht und materialien im quellcode aus (die rechnung hinterm farbwert habe ich gemacht, da ich liber mit farbwerten von 0-255 arbeite):

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
D3DLIGHT9   Licht;


D3DMATERIAL9    Kupfer;
D3DMATERIAL9    Gold;

Licht.Type          =  D3DLIGHT_POINT;

Licht.Diffuse.r     =  1.0f;
Licht.Diffuse.g     =  1.0f;
Licht.Diffuse.b     =  1.0f;
Licht.Diffuse.a     =  1.0f;

Licht.Ambient.r     =  1.0f;
Licht.Ambient.g     =  1.0f;
Licht.Ambient.b     =  1.0f;
Licht.Ambient.a     =  1.0f;

Licht.Specular.r    =  0.4f;
Licht.Specular.g    =  0.4f;
Licht.Specular.b    =  0.4f;
Licht.Specular.a    =  1.0f;

Licht.Position      =  D3DXVECTOR3(0.0f, 0.0f, -50.0f);

Licht.Range         =  1000.0f;

Licht.Attenuation0  =  0.0f;
Licht.Attenuation1  =  0.0f;
Licht.Attenuation2  =  0.0f;



Kupfer.Diffuse.r    =  (float)191/255;
Kupfer.Diffuse.g    =  (float)78/255;
Kupfer.Diffuse.b    =  (float)0/255;
Kupfer.Diffuse.a    =  (float)255/255;

Kupfer.Ambient.r    =  (float)1.91/255;
Kupfer.Ambient.g    =  (float)0.78/255;
Kupfer.Ambient.b    =  (float)0/255;
Kupfer.Ambient.a    =  (float)255/255;

Kupfer.Specular.r =  (float)200/255;
Kupfer.Specular.g =  (float)89/255;
Kupfer.Specular.b =  (float)0/255;
Kupfer.Specular.a =  (float)255/255;

Kupfer.Emissive.r =  (float)0/255;
Kupfer.Emissive.g =  (float)0/255;
Kupfer.Emissive.b =  (float)0/255;
Kupfer.Emissive.a =  (float)255/255;

Kupfer.Power        =  11.0f;



Gold.Diffuse.r  =  (float)194/255;
Gold.Diffuse.g  =  (float)179/255;
Gold.Diffuse.b  =  (float)51/255;
Gold.Diffuse.a  =  (float)255/255;

Gold.Ambient.r  =  (float)1.94/255;
Gold.Ambient.g  =  (float)1.79/255;
Gold.Ambient.b  =  (float)0.51/255;
Gold.Ambient.a  =  (float)255/255;

Gold.Specular.r =  (float)255/255;
Gold.Specular.g =  (float)255/255;
Gold.Specular.b =  (float)51/255;
Gold.Specular.a =  (float)255/255;

Gold.Emissive.r =  (float)0/255;
Gold.Emissive.g =  (float)0/255;
Gold.Emissive.b =  (float)0/255;
Gold.Emissive.a =  (float)255/255;

Gold.Power      =  30.0f;



Die Renderstates für die materialien:

Quellcode

1
2
if (materialauswahl == 1){lpD3DDevice->SetMaterial(&Gold);}
if (materialauswahl == 2){lpD3DDevice->SetMaterial(&Kupfer);}


Licht + Kamera ( im game loop):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
D3DXMatrixLookAtLH
(&Kamera,
&D3DXVECTOR3(   base_X*1.55f,
        ((base_X*base_X)/5.0f)+13.0f , 
        base_Z-10.5f),
&D3DXVECTOR3(base_X, base_Y, base_Z+3.0f),
&D3DXVECTOR3(0.0f, 0.1f, 0.0f));

lpD3DDevice->SetTransform(D3DTS_VIEW, &Kamera);




lpD3DDevice->SetLight(0, &Licht);
Licht.Position  =  D3DXVECTOR3( base_X*2,
                ((base_X*base_X)/9.0f)+13.0f, 
                -13);


Initialisierung von x-files:

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
hResult = D3DXLoadMeshFromX(L"dat_spielbrett.x", 
              D3DXMESH_MANAGED, 
              lpD3DDevice, 
              NULL, 
              &lpMaterialBuffer, 
              NULL, 
              &NumMaterials, 
              &objektmesh);

lpMaterials = (D3DXMATERIAL*)lpMaterialBuffer->GetBufferPointer();

lpMeshMaterials = new D3DMATERIAL9[NumMaterials];
lpTextures = new PDIRECT3DTEXTURE9[NumMaterials];



for (DWORD i=0;i<NumMaterials;i++){
        
    lpMeshMaterials[i] = lpMaterials[i].MatD3D;


    if(NULL != lpMaterials[i].pTextureFilename){


    hResult = D3DXCreateTextureFromFileExA(

        lpD3DDevice,        
        (lpMaterials[i].pTextureFilename),  
        D3DX_DEFAULT,       
        D3DX_DEFAULT,       
        D3DX_DEFAULT,           
        0,          
        D3DFMT_UNKNOWN,         
        D3DPOOL_MANAGED,        
        D3DX_FILTER_NONE,   
        D3DX_DEFAULT,       
        0,              
        NULL,               
        NULL,               
        &lpTextures[i]);

}   
}
lpMaterialBuffer->Release();


Rendern eines x-files:

Quellcode

1
2
3
for (DWORD i=0;i<NumMaterials;i++){

    objektmesh->DrawSubset(i);}

13

02.04.2009, 21:35

Wo aktivierst du denn dein Punktlicht?

C-/C++-Quelltext

1
2
3
4
5
// Licht setzen

lpD3DDevice->SetLight(0, &Licht);

// Hast du das irgendwo?

lpD3DDevice->LightEnable( 0, TRUE );


Global das Licht eingeschaltet (SetRenderState(D3DRS_LIGHTING, TRUE )) ?

Farboperationen (ColorOp) sehen wie aus?
fka tm

14

02.04.2009, 21:44

D3D Initialisieren:

C-/C++-Quelltext

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
    // Direct3D-Objekt erzeugen

    lpD3D = Direct3DCreate9(D3D_SDK_VERSION);


    // Parameter fuer den Modus festlegen

   
    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.SwapEffect     = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow  = hWnd;
    PParams.Windowed       = 0;

    PParams.BackBufferWidth  = FensterBreite;
    PParams.BackBufferHeight = FensterHoehe;
    PParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    PParams.BackBufferCount = 1;
    PParams.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;


    // Z-Buffer erzeugen

    PParams.AutoDepthStencilFormat = D3DFMT_D16;
    PParams.EnableAutoDepthStencil = TRUE;

    // Direct3D-Geraet anlegen

    lpD3D->CreateDevice(  D3DADAPTER_DEFAULT, 
                                 D3DDEVTYPE_HAL, 
                                 hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_MULTITHREADED, 
                                 &PParams, 
                                 &lpD3DDevice);



Scene Initialisieren(Renderstates,Lichter ein/aus-schalten):

C-/C++-Quelltext

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
lpD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
lpD3DDevice->SetRenderState(D3DRS_DITHERENABLE, 1);

    

//Kamera

D3DXMATRIX ViewMatrix;
D3DXMatrixLookAtLH(&ViewMatrix,
                   &D3DXVECTOR3(0.0f, 16.0f, -22.0f),
                   &D3DXVECTOR3(base_X, base_Y, 0.0f),
                   &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
lpD3DDevice->SetTransform(D3DTS_VIEW, &ViewMatrix);



//Projektion

D3DXMATRIX ProjMatrix;
D3DXMatrixPerspectiveFovLH(&ProjMatrix,
                           D3DX_PI/4,
                           static_cast<float>(FensterBreite) / static_cast<float>(FensterHoehe),
                           0.1f,
                           10000.0f );
lpD3DDevice->SetTransform(D3DTS_PROJECTION, &ProjMatrix);



lpD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);

lpD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
lpD3DDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE);
lpD3DDevice->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
lpD3DDevice->LightEnable(0, TRUE);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

02.04.2009, 22:00

Und wenn du das LightEnable mal aufrufst *nachdem* du das Licht gesetzt hast!?

16

02.04.2009, 22:08

davor oder danach macht keinen unterschied (gilt ja für die lichter im aktuellen D3D-Device allgemein). hatte es sogar schon im game-loop.

edit:
den thread hab ich auch aufgemacht:
http://www.hardwareluxx.de/community/showthread.php?p=11724874#post11724874

17

02.04.2009, 22:09

Wo setzt du die Textur (und TextureStates)?

ColorOp hast du noch unterschlagen

Waraum schaltest du das ab: D3DRS_COLORVERTEX?

Hat zwar nichts mit deinem Problem zu tun,
aber, bei CreateDevice: D3DCREATE_MULTITHREADED - Wozu?


PS:
Bitte C++ - Codetags verwenden
fka tm

18

02.04.2009, 22:17

texturen hat das game (noch keine).

das mit colorvertex und multithread hatte ich ma zum ausprobieren gemacht, hatte aber keine auswirkungen.

in büchern habe ich noch so gut wie garnichts über ColorOp erfahren und habe es bisher noch nicht benutzt. sollte man das vllt? sorry, aber kann mich ma wer bitte darüber aufklären?

19

02.04.2009, 22:28

könnt ihr das hier noch ma testen?

hab nen anderes stencil-format und die hardwarebeschleunigung auf mixed:

http://uploaded.to/?id=fl4rb4 -neuer link

20

02.04.2009, 22:52

Denke, du schraubst am falschen Ende rum. :?

Lade dir eine weiße Textur als Dummy, bzw. zum Farbenmischen.

Ambient und Diffuse etwas weniger beim Punktlicht (z.B. 0.5f)

Dann:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
Device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);

Device>SetMaterial( &DeinMaterial );
Device>SetTexture( 0, pDeineTextur );
...
Mesh->DrawSubset(n);
...


"colorvertex und multithread" auskommentieren.

Dann werde ich vielleicht noch mal testen.
fka tm

Werbeanzeige