[C# .Net][XNA 4.0] Artifacts probleempje bij 'het omkijken'

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
Beste medetweakers,

Zoals zoveel programmeurs heb ik besloten om me eens te verdiepen in XNA.
Dat gaat best goed. Heb wat tutorials doorgelezen, zoals die van de MSDN en van Riemers.

Inmiddels ben ik zover dat ik een terrein heb waarover ik heen kan bewegen en met de muis kan ik alle kanten opkijken. Net een FPS.

Alleen loop ik stuk op het volgende:
Zolang ik naar de negatieve Z-as kijk, dan heb ik geen artifacts in mijn terrein en ziet alles er (amateur, maar) correct uit.
Zodra ik mijn nek omdraai en naar de positieve Z-as kijk, dan zie ik de vertices die verder weg liggen door de vertices heen die dichterbij zijn.

De tutorials hebben hier geen last van en ik gebruik code van de Riemers XNA tutorials om mijn terrein te genereren. Ik gebruik een TriangleList + Index. Heb al wat zitten klooien met de 'world'-matrix. De code is daardoor cleaner geworden, maar de bug is gebleven.

Ik kan het probleem overigens precies andersom maken door het genereren van de indices op de vertices qua Z-as precies om te draaien. Als ik dan in de negatieve Z-as kijk gaat het fout en bij de positieve Z-as lijkt alles goed.

Eventueel is er uiteraard code beschikbaar, maar zit nu even op een plek waar ik die code niet heb. (Maar wel tijd voor het schrijven van dit topic)

Ik kan wel wat hints gebruiken wat ik fout doe. Maak ik verkeerde indices? Moet ik mijn hoofd niet draaien, maar de wereld? Zit er al uren mijn hoofd over te breken...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Klinkt alsof je z-testing gewoon niet aan hebt staan.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Verkeerde CullMode misschien?

Probeer dit eens in het begin van je draw method:
C#:
1
graphicsDevice.RasterizerState = RasterizerState.CullNone;


http://www.c-sharpcorner.com/UploadFile/iersoy/2932/

[ Voor 15% gewijzigd door Hyperz op 19-09-2011 16:28 ]

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
Hyperz schreef op maandag 19 september 2011 @ 16:26:
Verkeerde CullMode misschien?

Probeer dit eens in het begin van je draw method:
C#:
1
graphicsDevice.RasterizerState = RasterizerState.CullNone;


http://www.c-sharpcorner.com/UploadFile/iersoy/2932/
Ik ben bekent met het feit dat vertices CW of CCW opgegeven moeten worden.
Daarbinnen heb ik alle variaties inmiddels geprobeerd.

Als ik CullNone gebruik, dan zie ik niet alleen de vertices die ik 'face', maar ook de vertices die onzichtbaar zijn, omdat ze zo liggen dat ik ze niet zou moeten zien. Ergo: het probleem wordt alleen maar erger.

Zal vanavond de code wel ff droppen met wat screenshots.

Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
.oisyn schreef op maandag 19 september 2011 @ 16:17:
Klinkt alsof je z-testing gewoon niet aan hebt staan.
Is daar ook nog een andere term voor? Ik vind niet zoveel op google onder z-testing, al snap ik wel wat je bedoelt. De 'engine' checkt niet of een bepaald vlak voor of achter een ander vlak ligt, althans zo lijkt het.
Maar nu lijkt dit wel te gebeuren zo lang het op de negatieve Z-as ligt en niet te gebeuren op de positieve Z-as.
Ik vermoed toch dat het probleem elders ligt.

Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
Ah, ik heb wat gevonden om thuis eens naar te kijken wat ik er mee doe:
device.RenderState.DepthBufferEnable = false;

Misschien teveel geknipt en geplakt waardoor deze regel ergens staat. Dit zou voor het probleem kunnen zorgen.

Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Dat werkt niet meer in XNA 4.0. Je zult dit moeten doen:

C#:
1
2
3
4
DepthStencilState depthBufferState;
depthBufferState = new DepthStencilState(); 
depthBufferState.DepthBufferEnable = true;
graphicsDevice.DepthStencilState = depthBufferState;


Ah! Nu weet ik het weer! Ik heb al tijden XNA niet meer gebruikt maar ik herken je probleem wel. Als ik me niet vergis wijzigt de SpriteBatch de renderstate soms (of altijd?). Dus je plaatst best ook al je SpriteBatch code op het einde van je draw method.

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
Hyperz schreef op maandag 19 september 2011 @ 16:51:
Dat werkt niet meer in XNA 4.0. Je zult dit moeten doen:

C#:
1
2
3
4
DepthStencilState depthBufferState;
depthBufferState = new DepthStencilState(); 
depthBufferState.DepthBufferEnable = true;
graphicsDevice.DepthStencilState = depthBufferState;


Ah! Nu weet ik het weer! Ik heb al tijden XNA niet meer gebruikt maar ik herken je probleem wel. Als ik me niet vergis wijzigt de SpriteBatch de renderstate soms (of altijd?). Dus je plaatst best ook al je SpriteBatch code op het einde van je draw method.
Ik heb een stukje code die de framerate op het beeld zet. Die wordt natuurlijk altijd helemaal vooraan getoont, dus op dat moment wordt er iets met de Z-buffer gedaan. Wedden dat die dit veroorzaakt? :)

Ik denk dat jij me inderdaad net die code hebt gegeven die ik dan nog moet toevoegen.

Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Ik denk dat je het wss gewoon kan oplossen door spritebatch calls achter alle andere drawing code te plaatsen en je niet eens die code nodig zult hebben. Althans, zo herinner ik het mij, maar ik kan verkeerd zijn.

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Kaw
  • Registratie: Maart 2001
  • Laatst online: 03-09 20:24
De calls staan achter de code, maar toch zijn ze de oorzaak van de depth-buffer issues. Heb dus maar even de framecounter uitgezet. Heeft toch geen prioriteit zolang ik niets release.

Maar bedankt! Dit topic is officieel opgelost :)
Pagina: 1