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

1

18.12.2009, 21:19

PostShader Problem in GooseGogs

Hallo Leuts, ich brauche dringend Rat.

Die Post-Effekte in GooseGogs laufen Problemlos auf den Nvidia-Grakas. Habe auf 280gtx, 7900gs, 5600fx und ion (9400m) getestet. Auf ALLEN Intel und Ati-Grakas habe ich einen schwarzen Bildschirm; kein Absturz. Am Shader an sich liegts nicht, auch wenn ich das Bild ohne Effekt rendere habe ich das Problem.

Hier ein wenig Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Global:

struct CustomVertex{
    float x, y, z;    
    float extrapos;      
    float tu, tv;
};


IDirect3DSurface9 *Surf;
LPD3DXEFFECT peffect = NULL;


    IDirect3DTexture9 *RenderTarget; 
    IDirect3DSurface9 *RenderTargetSurface;    
    IDirect3DSurface9 *OldRenderTarget;


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
43
44
45
46
47
48
49
50
51
52
53
Vor der Gameloop:

lpD3DDevice->CreateTexture(FensterBreite, 
               FensterHoehe, 1, 
               D3DUSAGE_RENDERTARGET, 
               D3DFMT_A8R8G8B8, 
               D3DPOOL_DEFAULT, 
                           &RenderTarget, NULL); 




lpD3DDevice->CreateRenderTarget(FensterBreite, 
                FensterHoehe, 
                D3DFMT_A8R8G8B8, 
                D3DMULTISAMPLE_NONE, 
                NULL, TRUE, 
                &RenderTargetSurface, NULL);




CustomVertex PostEffectQuad[6] =
{

        {                   -1,                   0,   0,1, 0,0},
        {                   -1, (float)FensterHoehe,   0,1, 0,1},
        {(float)FensterBreite,  (float)FensterHoehe,   0,1, 1,1},
        {                   -1,                   0,   0,1, 0,0},
        {(float)FensterBreite,                    0,   0,1, 1,0},
        {(float)FensterBreite,  (float)FensterHoehe,   0,1, 1,1}

};

for(int i=0; i<6; i++) PostEffectQuad[i].extrapos=0; 



D3DXCreateEffectFromFile(lpD3DDevice,
             L"data//postshader.fx",
             NULL,
             NULL,
             D3DXSHADER_USE_LEGACY_D3DX9_31_DLL,
             NULL,
             &peffect,
             NULL));

lpD3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
lpD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
lpD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
lpD3DDevice->SetRenderState(D3DRS_DITHERENABLE, FALSE);

lpD3DDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_TEX1);

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
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
In der Gameloop:

if(enable_shader==1){
   if (GameState != GS_PLAYING){
        peffect->SetTechnique("ExtraBlurShader3");
   }else{
        peffect->SetTechnique(ak_level.shader);}
    



    lpD3DDevice->GetRenderTarget(0, &OldRenderTarget); 
   
    lpD3DDevice->SetRenderTarget(0, RenderTargetSurface);

    lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, ClearColor, 1.0f, 0);

    lpD3DDevice->BeginScene();








    //Hier wird das Spiel gezeichnet....






    

    RenderTarget->GetSurfaceLevel(0, &RenderTargetSurface); 

    lpD3DDevice->EndScene(); 

    lpD3DDevice->SetRenderTarget(0, OldRenderTarget);

    lpD3DDevice->BeginScene();

    //lpD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0); 







    UINT passes=1;


    peffect->Begin(&passes,0);

    peffect->BeginPass(0);


    lpD3DDevice->SetTexture(0, RenderTarget); 

    lpD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, PostEffectQuad, sizeof(CustomVertex));


    peffect->EndPass();

    peffect->End();





    lpD3DDevice->EndScene();

    lpD3DDevice->Present(NULL, NULL, NULL, NULL);




}else{

    lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, ClearColor, 1.0f, 0);
    lpD3DDevice->BeginScene();






    //Hier wird das Spiel gezeichnet....



    lpD3DDevice->EndScene();
    lpD3DDevice->Present(NULL, NULL, NULL, NULL);
}


Ich hoffe ihr könnt helfen, das in den Griff zu bekommen. Syntaxfehler oder Fehler im Shader sind wie schon gesagt ausgeschlossen.

Vielen Dank, Gruß Fred

2

18.12.2009, 21:26

Muss da jedesmal ein End-Scene bzw. Begin-Scene Paar hin, nachdem dass Render-Target gesetzt wird ?

3

18.12.2009, 21:27

Zitat von »"E122"«

Muss da jedesmal ein End-Scene bzw. Begin-Scene Paar hin, nachdem dass Render-Target gesetzt wird ?


Hab ich doch ;)

4

18.12.2009, 21:27

Ich hab gemeint, ob das wirklich nötig ist ;) deshalb dass ?

5

18.12.2009, 21:28

Zitat von »"E122"«

Ich hab gemeint, ob das wirklich nötig ist ;) deshalb dass ?


na klar, würde ich das nicht machen, bekäme ich einen absturz.

6

18.12.2009, 21:29

Echt, bei mir gings bisher ohne ??
Und wieder was dazugelernt :)

EDIT:
Ist denn auf dem Rendertarget vor dem Post-Processing korrekt gerender, oder auch schrwarz ?

7

18.12.2009, 21:31

Zitat von »"E122"«

Echt, bei mir gings bisher ohne ??
Und wieder was dazugelernt :)

EDIT:
Ist denn auf dem Rendertarget vor dem Post-Processing korrekt gerender, oder auch schrwarz ?


lasse ich alle effekte oder shader weg, und render einfach normal, erhalte ich auch schwarz. der fehler liegt entweder beim rendern in das target, oder beim rendern des targets auf den vertexquad.

8

18.12.2009, 21:32

Ist schwarz die Clear-Color ? FVF gesetzt ?

9

18.12.2009, 21:33

Zitat von »"E122"«

Ist schwarz die Clear-Color ?
nein ist sie nicht. als clearcolor verwende ich die ergebnisfarbe meines dynamischen hintergrungfarbensystems. daran habe ich gar nicht gedacht. anscheinend ist das rendertarget also schwarz !?

FVF ist auch gesetzt: lpD3DDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_TEX1);

das ärgerliche ist ja, dass es auf meinen nvidia-systemen tadello läuft!

10

18.12.2009, 21:36

Bei D3DFVF_XYZRHW, darf doch die Positionsangabe nur 2Dimensional sein, oder ?

EDIT: Was sagt denn die Direct3DDebug - Ausgabe ?

EDIT II:

C-/C++-Quelltext

1
  lpD3DDevice->SetRenderTarget(0, RenderTargetSurface); 


probiers mal mit
RenderTarget->GetSurfaceLevel (..... ) statt RenderTargetSurface.

Werbeanzeige