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

11

30.10.2011, 14:04

Zitat

Wofür würdest du den denn benötigen?
Nun, um irgendwas mehr oder weniger transparent dastellen zu können :)
Außer natürlich, man kann die selben Effekte auch anders darstellen.
Als Beispiel würde mir jetzt grad ein Hologramm einfallen, oder ein Raumschiffschutzschild.
Oder in einem Fantasyspiel eine Erscheinung wie einen Geist langsam verblassen lassen.

Wie gesagt, wenn das auch anders geht, brauche ich es natürlich nicht :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

30.10.2011, 14:10

Für einfaches Alphablending braucht der BackBuffer keinen Alphakanal. Das war noch nie so ;)

13

31.10.2011, 00:40

Dann wär ja auch das geklärt :)

Obwohl die Inititalisierung jetzt doch sehr einfach sein müsste, krieg ich es trotzem nicht hin :(

Ich bekomm immer nen Runtime Fehler wegen der nicht initialisierten Variable D3DD, die die IDirect3DDevice Schnittstelle darstellt.

Hier mein Code

InitDirect.hpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once

#include "d3d9.h"


struct TempParams
{
    int VideoModeWidth;
    int VideoModeHeight;
    int VIdeoRefreshRate;
};

void InitD3DDevice (PDIRECT3D9 D3D, TempParams* Temp, HWND FocusWindow, PDIRECT3DDEVICE9 D3DD);

void SetDirect3DParams (PDIRECT3D9 D3D, TempParams* Temp);

D3DMULTISAMPLE_TYPE GetHightestMultiSampling (PDIRECT3D9 D3D, DWORD* QualityLevel,
                                              D3DFORMAT SurfaceFormat = D3DFMT_X8R8G8B8, BOOL Windowed = false);


Hier InitDirect3D.cpp

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
33
34
35
36
37
38
39
40
41
42
#include "Init Direct3D.hpp"


void InitD3DDevice (PDIRECT3D9 D3D, TempParams* Temp, HWND FocusWindow, PDIRECT3DDEVICE9 D3DD)
{
    D3DPRESENT_PARAMETERS PresentParams;
    DWORD MultiSamplingQuality = 0;

    PresentParams.BackBufferWidth           = Temp->VideoModeWidth;
    PresentParams.BackBufferHeight          = Temp->VideoModeHeight;
    PresentParams.BackBufferFormat          = D3DFMT_X8R8G8B8;
    PresentParams.BackBufferCount           = 1;
    PresentParams.MultiSampleType           = GetHightestMultiSampling (D3D, &MultiSamplingQuality);
    PresentParams.MultiSampleQuality        = MultiSamplingQuality;
    PresentParams.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow             = FocusWindow;
    PresentParams.Windowed                  = false;
    PresentParams.EnableAutoDepthStencil    = true;
    PresentParams.AutoDepthStencilFormat    = D3DFMT_D24S8;
    PresentParams.Flags                     = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    PresentParams.FullScreen_RefreshRateInHz  = Temp->VIdeoRefreshRate;
    PresentParams.PresentationInterval      = D3DPRESENT_INTERVAL_DEFAULT;

    D3D->CreateDevice (D3DADAPTER_DEFAULT, 
                       D3DDEVTYPE_HAL, FocusWindow, 
                       D3DCREATE_HARDWARE_VERTEXPROCESSING,
                       &PresentParams, &D3DD);
}

void SetDirect3DParams (PDIRECT3D9 D3D, TempParams* Temp)
{
    D3DDISPLAYMODE* CurrentMode = new D3DDISPLAYMODE;

    D3D->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, CurrentMode);

    Temp->VideoModeWidth   = CurrentMode->Width;
    Temp->VideoModeHeight  = CurrentMode->Height;
    Temp->VIdeoRefreshRate = CurrentMode->RefreshRate;

    delete CurrentMode;
    CurrentMode = 0;
}


Die lange Implementierung von GetHightestMultiSampling schreib ich mal nicht mit rein

Hier noch main.cpp

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
33
#include "GameWindow.hpp"
#include "Init Direct3D.hpp"

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char* CmdLine, int CmdShow)
{
    PDIRECT3D9 D3D = Direct3DCreate9 (D3D_SDK_VERSION);
    PDIRECT3DDEVICE9 D3DD;
    TempParams* Temp = new TempParams;

    SetDirect3DParams (D3D, Temp);

    GameWindow GameWin;
    GameWin.Create (L"Game", 0, Temp->VideoModeWidth, Temp->VideoModeHeight);

    

    InitD3DDevice (D3D, Temp, GameWin.GetHwnd (), D3DD);

    ShowWindow (GameWin.GetHwnd (), CmdShow);

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }

    delete Temp;
    Temp = 0;

    D3D->Release ();
    D3DD->Release ();
}


Ich habe mir den Beispiel Code angesehen und dort wird der Zeiger g_pD3DDevice auch nicht initialisiert.
8|

Was mache ich hier also falsch?
Debugger spuckt nichts aus, mit dem ich was anfangen könnte.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

31.10.2011, 00:43

Was genau wundert dich da? Du übergibst den Wert von D3DD an InitD3DDevice(). In der Funktion wird ein Device erzeugt und dessen Adresse in den lokalen Parameter mit Namen "D3DD" gespeichert. Nachdem die Funktion fertig gelaufen ist, wird die lokale Variable zerstört. Dem D3DD aus WinMain() selbst wird nirgendwo ein Wert zugewiesen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (31.10.2011, 00:52)


15

31.10.2011, 04:05

So, endlich geschafft.

Danke nochmals für die Hilfe! :)

Werbeanzeige