Dibujando un map de profundidad apropiadamente

Quiero renderizar un map de profundidad importándolo de un file, luego creando una matriz de vértices e índices, y luego mostrándolo usando un sombreador básico (simplemente aplique las matrices de visualización y proyección en él y luego visualícelas). Soy consciente de las soluciones basadas en GPU, sin embargo, deseo realizar cálculos adicionales usando la CPU en los vértices antes de representarlos.

Entonces, básicamente lo que hago es que tengo mis vértices con profundidad en una grilla, y luego importo mis triangularjs de la siguiente manera:

+--+--+--+--+--+--+ ¦ \¦ \¦ \¦ \¦ \¦ \¦ +--+--+--+--+--+--+ meaning that I simply split every quad spanned by four pixels ¦ \¦ \¦ \¦ \¦ \¦ \¦ into two triangles. +--+--+--+--+--+--+ ¦ \¦ \¦ \¦ \¦ \¦ \¦ +--+--+--+--+--+--+ 

Cuando tomé el primer map de mejor profundidad que encontré en google, obtuve este resultado: Trabajando

Sin embargo, tan pronto como muevo la camera, suceden cosas extrañas: Buggy pic Buggy pic 2

El problema parece popup solo cuando se representan múltiples triangularjs uno detrás del otro. En este caso, un triángulo de la parte posterior (uno negro a profundidad infinita o una panetworking detrás del object frontal) parece brillar a través. Además, cuando uso "PIX para Windows" y utilizo la funcionalidad "Depurar este píxel", obtengo dos triangularjs para cada uno de los píxeles defectuosos que he comprobado.

La renderización se realiza de la siguiente manera:

Initialize

 graphics.PrefernetworkingBackBufferWidth = 1280; graphics.PrefernetworkingBackBufferHeight = 720; graphics.IsFullScreen = false; graphics.ApplyChanges(); IsMouseVisible = true; 

Draw

 GraphicsDevice.Clear(ClearOptions.DepthBuffer | ClearOptions.Target, Color.Black, 0, 0); DrawModel(); spriteBatch.Begin(); DrawControls(); DrawFileBrowser(); spriteBatch.End(); base.Draw(gameTime); 

DrawModel

 GraphicsDevice.RasterizerState = new RasterizerState { CullMode = CullMode.None }; // [...] // set up view and projection matrix // [...] GraphicsDevice.DrawUserIndexedPrimitives( PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3); 

¿Cuál podría ser el problema en mi método de renderizado? ¿Tengo que orderar de alguna manera mis triangularjs de atrás hacia adelante? (no se usan valores alfa) En caso afirmativo, ¿cómo puedo orderarlos?

¿Es tal vez algún problema con el buffer de profundidad? ¿Cómo puedo arreglarlo?

¿Alguna otra idea sobre cómo solucionar el problema?

Editar

El código de Shader es básico:

 float4x4 View; float4x4 Projection; void VS_Model(in float4 inPosition : POSITION, in float4 inColor : COLOR, out float4 outPosition : POSITION, out float4 outColor : TEXCOORD0) { outPosition = mul(mul(inPosition, View), Projection); outColor = inColor; } void PS_Model(in float4 inColor : TEXCOORD0, out float4 outColor : COLOR) { outColor = inColor; } technique Model { pass { VertexShader = compile vs_3_0 VS_Model(); PixelShader = compile ps_3_0 PS_Model(); } } 

Parece que renderiza sin testing de profundidad. Esto podría hacer que los triangularjs más alejados se rendericen sobre triangularjs más cercanos, ya que podrían representarse posteriormente.

La solución es activar las testings de profundidad en su configuration de renderizado y establecer la function de comparación de profundidad en Less or LessEqual. Recuerde activar la escritura de profundidad también si la tiene desactivada.