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

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

1

14.02.2012, 22:57

[DX11] Depth Buffer bleibt leer

Hallo zusammen :)

Ich wollte mal Shadow Mapping implementieren und dabei ist mir aufgefallen, dass mein Depth Buffer "leer" ist. (PIX zeigt mir nur ein schwarzes Bild an)
Da ich mich jetzt seit Tagen deswegen im Kreis bewege hoffe ich das ihr mir helfen könnt.

Mittlerweile habe ich schon herausgefunden, dass wenn ich die depth test funktion auf Greater setze (dann den depth buffer natürlich mit 0.0f anstatt 1.0f cleare) ich immer hin die umrisse meiner Geometrie im buffer sehe. Allerdings nur in schwarz und weiß (keine grautöne, wie ich sie in einem depthbuffer erwartet würde)

DepthBuffer und Depth Stencil View erzeuge ich so: (SlimDx)

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
Texture2DDescription depthBufferDesc = new Texture2DDescription();
depthBufferDesc.Width = (int)WindowSize.X;
depthBufferDesc.Height = (int)WindowSize.Y;
depthBufferDesc.MipLevels = 1;
depthBufferDesc.ArraySize = 1;
depthBufferDesc.Format = Format.D24_UNorm_S8_UInt;
depthBufferDesc.SampleDescription = new SampleDescription( 1, 0 );
depthBufferDesc.Usage = ResourceUsage.Default;
depthBufferDesc.BindFlags = BindFlags.DepthStencil;
depthBufferDesc.CpuAccessFlags = CpuAccessFlags.None;
depthBufferDesc.OptionFlags = ResourceOptionFlags.None;

DepthBuffer = new Texture2D( Dev, depthBufferDesc );

////////////////////////////////////////////////////
// Depth Stencil State
DepthStencilStateDescription depthDesc = new DepthStencilStateDescription();
depthDesc.IsDepthEnabled = true;
depthDesc.DepthWriteMask = DepthWriteMask.All;
depthDesc.DepthComparison = Comparison.Less;

depthDesc.IsStencilEnabled = true;
depthDesc.StencilReadMask = 0xff;
depthDesc.StencilWriteMask = 0xff;

// Front face
depthDesc.FrontFace = new DepthStencilOperationDescription()
{
    FailOperation = StencilOperation.Keep,
    DepthFailOperation = StencilOperation.Increment,
    PassOperation = StencilOperation.Keep,
    Comparison = Comparison.Always,
};

// Back face
depthDesc.BackFace = new DepthStencilOperationDescription()
{
    FailOperation = StencilOperation.Keep,
    DepthFailOperation = StencilOperation.Decrement,
    PassOperation = StencilOperation.Keep,
    Comparison = Comparison.Always,
};

DepthStateOn = DepthStencilState.FromDescription( Dev, depthDesc );

// Apply Stencil state
Context.OutputMerger.DepthStencilState = DepthStateOn;

////////////////////////////////////////////////////
// Depth Stencil View
DepthStencilViewDescription depthViewDesc = new DepthStencilViewDescription();
depthViewDesc.Format = Format.D24_UNorm_S8_UInt;
depthViewDesc.Dimension = DepthStencilViewDimension.Texture2D;
depthViewDesc.MipSlice = 0;
depthViewDesc.ArraySize = 0;
depthViewDesc.FirstArraySlice = 0;
depthViewDesc.Flags = DepthStencilViewFlags.None;

DepthView = new DepthStencilView( Dev, DepthBuffer, depthViewDesc );

// Bind stencil buffer
Context.OutputMerger.SetTargets( DepthView, BackBufferTarget.RTView );


View und Projetions matrix sind folgende:

C#-Quelltext

1
2
3
4
5
6
NearValue = 1.0f;
FarValue = 1000.0f;

// AspectRatio ist 1.333333 (1024 / 768)
ProjectionMatrix = Matrix.PerspectiveFovLH( (float)( Math.PI / 4.0f ), Settings.AspectRatio, NearValue, FarValue );
ViewMatrix = Matrix.LookAtLH( new Vector3( 0, 200, 0 ), new Vector3(200,0,200), Vector3.UnitY );


Was mich auch ein wenig stutzig macht ist, dass ich in stencil buffer die umrisse des Terrains erkenne, obwohl ich den nicht einmal benutze. Clearen mach ich folgendermaßen:

C#-Quelltext

1
2
Context.ClearRenderTargetView( RenderTarget.RTView, ClearColor );
Context.ClearDepthStencilView( DepthView, DepthStencilClearFlags.Depth, 1.0f, 0 );

Hier mal ein Bild vom Stencil Buffer wie ich ihn aus PIX bekomme:


Was mich aber am meisten wundert: Ich habe keinerlei probleme, was das rendern an sich angeht (außer natürlich ich benutze greater, dann bekomm ich den gleichen effekt, als ob ich keinen depth buffer benutzen würde):


Ich bin total ratlos und sehe den Wald vor lauter Bäumen nicht mehr... Ich wäre also für jede Idee dankbar :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.02.2012, 23:55

Sagt die Debug Runtime irgendwas? Wofür genau brauchst du den Stencil Buffer? Schalt IsStencilEnabled doch mal ab.

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

15.02.2012, 00:00

Debug Runtime sagt leider nichts (außer die ganzen Infos über erzeugte und zerstörte objekte am Ende)
Stencil Buffer brauch ich nicht. Ich hab nur zieeeeehmlich viel ausprobiert und wohl vergessen den wieder zu deaktivieren. Gut das erklärt warum etwas im Stencil Buffer war. Nachdem ich den jetzt deaktiviert hab bleibt der auch leer.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.02.2012, 00:07

Render die Shadowmap mal mit den selben Matritzen und Shadern wie den normalen Frame, um sicherzustellen dass dort kein Fehler liegt.

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

15.02.2012, 00:11

Hab ich vergessen zu erwähnen bzw. kam nicht eindeutig rüber: Shadow maps sind nur mein ziel.

Im Moment ist das jetzt ein einziger render pass, der genau das rendert, was auf dem screenshot zu sehen ist, aber halt einen leeren depth buffer hinterlässt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

15.02.2012, 00:19

Ok, das ist merkwürdig. Was genau sind denn alle Unterschiede was die States betrifft zwischen dem funktionierenden normalen Pass und der Shadowmap?

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

7

15.02.2012, 00:33

Ich glaub wir reden grad aneinander vorbei. Der normale pass funktioniert ja eben nicht. Der ist übrig geblieben als ich während der fehlersuche alles andere rausgenommen habe.
Das ist jetzt einfach nur ein clear -> vertices rendern -> present
Und dabei ist mir dann eben aufgefallen, dass der depth buffer nur eine schwarze fläche ist. Also nach den clear nicht mehr beschrieben wird.
Ist mit dem REF device übrigens auch so. Also treiber wirds auch nicht sein, sondern ich hab irgendwo was verbockt...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

15.02.2012, 00:39

Oh, Ok. Das ist in der Tat merkwürdig. Bist du dir eigentlich sicher dass der Depth Buffer leer ist? Ich mein, wenn das normale Rendering korrekt aussieht, dann kann das ja eigentlich nicht sein!?

Sylence

Community-Fossil

  • »Sylence« ist der Autor dieses Themas

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

15.02.2012, 14:58

Zumindest laut PIX. Und ich habe mir auch extra mal ein paar DepthBuffer Beispiel Programme in PIX angeguckt und dort war der Depth Buffer immer mit grauwerten gefüllt.

Werbeanzeige