New to XNA (3D) -- familiar with OpenGL (but it has been a few years).
I've been working on an engine that should be a 3D Isometric View, but I'm having issues with things rendering. I wouldn't be shocked if I'm doing it the "wrong" way.
To start -- I'm assembling a bunch of terrain, which is procedurally generated into a Vertex. I'm using X/Y as my ground (N/S/E/W) coordinates and Z as my vertical (Up/Down). I assemble a map into the VertexBuffer based on its absolute world coordinates, i.e. Map is 256x256 tiles; a Map is a Tile on the world, also 256x256, so 0,0 Position of the Map on the World would be 0,0 -> 255,255; world position 1,0 would contain 256,0 -> 511,255 (top left -> bottom right).
I've followed a few tutorials and thankfully gotten some help on setting things up, but I feel as though something is still "wrong." My scene is not drawing correctly. It looks as though only ONE face of my scene is being drawn -- perhaps I haven't setup the Depth buffer correctly? When I rotate (I just change Rotation on the object pCamera), once I turn ~90-180 degrees, I start missing pieces of the Mesh. To me, it seems like the Depth isn't configured properly. I know in GL, we had to manually set the DEPTH_BIT / flag to on. I haven't set a World matrix to this BasicEffect, since the VertexBuffer is already built in the World coordinates.
I've confirmed the VertexBuffer is properly written/assembled. The values are all correct. The VertexBuffer is full of triangles only -- so I'm just using a TriangleList.
The VertexBuffer (TileMeshVertexBuffer) is being attached to a BasicEffect (TileMeshEffect), and this is the extent of my code:
TileMeshEffect = new BasicEffect( GraphicsDevice );
if ( _priorResolution != pCamera.Resolution )
{
Single Width = pCamera.Resolution.Width / MapTile.DIMENSION;
Single Height = pCamera.Resolution.Height / MapTile.DIMENSION;
TileMeshEffect.Projection = Matrix.CreateOrthographic( Width, Height, 1, 2000 );
_priorResolution = pCamera.Resolution;
}
if ( _priorCenter != pCamera.Center || _priorRelativePosition != pCamera.RelativePosition || _priorRotation != pCamera.Rotation )
{
Single AngularUnit = pCamera.Resolution.Height / MapTile.DIMENSION;
//pCamera.RelativePosition is 0, 0, 20
//pCamera.Center is 128,128,60 (center of the mesh -- current elevation for the tile is at 50, so the middle tile it is focused above is 128,128,50; or composed of 127,127,50 -> 128,127,50 -> 128,128,50 and 127,127,50 -> 128,128,50 -> 127,128,50 (two triangles).
//I've confirmed the other faces are correct for this tile as well, since it is actually rendering a cube.
//The goal is to rotate around the Z axis -- perhaps this is the part that is wrong, but I feel as though I'd still see cubes, just rendered unusually.
Vector3D CameraLocation = new Vector3D( pCamera.Center.X + pCamera.RelativePosition.X + AngularUnit * Math.Cos( pCamera.Rotation ),
pCamera.Center.Y + pCamera.RelativePosition.Y + AngularUnit * Math.Sin( pCamera.Rotation ), pCamera.Center.Z + pCamera.RelativePosition.Z );
TileMeshEffect.View = Matrix.CreateLookAt( CameraLocation.ToVector3(), pCamera.Center.ToVector3(), Vector3.UnitZ );
_priorCenter = pCamera.Center;
_priorRelativePosition = pCamera.RelativePosition;
_priorRotation = pCamera.Rotation;
}
//Texture is good -- all tiles are only mapping to one tile, statically on the texture, nothing else.
TileMeshEffect.Texture = TileMeshTexture;
TileMeshEffect.TextureEnabled = true;
TileMeshEffect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.SetVertexBuffer( TileMeshVertexBuffer );
GraphicsDevice.DrawPrimitives( PrimitiveType.TriangleList, 0, TileMeshVertexBuffer.VertexCount / 3 );
I've cut and pasted things -- but this is essentially all I have. Aside from that, the GraphicsDeviceManager has the following set:
Graphics = new GraphicsDeviceManager( this )
{
PreferredBackBufferHeight = 720,
PreferredBackBufferWidth = 1280,
};
I'm setting normals on each of the Triangles in my VertexBuffer -- so they're VertexPositionNormalTexture's -- and again, I've confirmed that these values are all correct.
This is what I see: https://i.stack.imgur.com/q6jg3.jpg
EDIT:
I've added the following code (Culling!) before I render the scene, and I get MUCH closer. However, I still have some issues with rotation, wherein pieces do not render.
GraphicsDevice.RasterizerState = new RasterizerState()
{
CullMode = CullMode.None
};
https://i.stack.imgur.com/WhuGw.jpg
There are now "holes" in the terrain as it rotates.