Hi guys
In previous posts I explained how I was using a heightmap as a platform for experimentation with different projects but through help from different forums and google research found out that all I needed was a quad to use as a terrain(link below), and the next thing I would like to try is adding multiple textures along with separate uv coordinates for each texture(ex. grass textcoord1,sand textcoord2,etc..) and if possible for right now without using a shader,if anyone can help me work towards how this would be done would be much appreciated.
Thankyou
http://allenwp.com/blog/2010/05/06/simple-fast-gpu-driven-multi-textured-terrain/
below is the link to the project Ive been experimenting with
and parts of the code Ive modified so far
http://msdn.microsoft.com/en-us/library/bb464051%28v=xnagamestudio.31%29.aspx
changed vertex in quad struct from one vertex format to a custom made(VertexMultitextured)
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.Content;
namespace TexturedQuad
{
public struct Quad
{
public Vector3 Origin;
public Vector3 UpperLeft;
public Vector3 LowerLeft;
public Vector3 UpperRight;
public Vector3 LowerRight;
public Vector3 Normal;
public Vector3 Up;
public Vector3 Left;
public VertexMultitextured[] Vertices;
public int[] Indexes;
public Quad( Vector3 origin, Vector3 normal, Vector3 up,
float width, float height )
{
Vertices = new VertexMultitextured[4];
Indexes = new int[6];
Origin = origin;
Normal = normal;
Up = up;
// Calculate the quad corners
Left = Vector3.Cross( normal, Up );
Vector3 uppercenter = (Up * height / 2) + origin;
UpperLeft = uppercenter + (Left * width / 2);
UpperRight = uppercenter - (Left * width / 2);
LowerLeft = UpperLeft - (Up * height);
LowerRight = UpperRight - (Up * height);
FillVertices();
}
private void FillVertices()
{
// Fill in texture coordinates to display full texture
// on quad
Vector2 textureUpperLeft = new Vector2( 0.0f, 0.0f );
Vector2 textureUpperRight = new Vector2( 1.0f, 0.0f );
Vector2 textureLowerLeft = new Vector2( 0.0f, 1.0f );
Vector2 textureLowerRight = new Vector2( 1.0f, 1.0f );
// Provide a normal for each vertex
for (int i = 0; i < Vertices.Length; i++)
{
Vertices[i].Normal = Normal;
}
// Set the position and texture coordinate for each
// vertex
Vertices[0].Position = LowerLeft;
Vertices[0].TextureCoordinate1 = textureLowerLeft;
Vertices[1].Position = UpperLeft;
Vertices[1].TextureCoordinate1 = textureUpperLeft;
Vertices[2].Position = LowerRight;
Vertices[2].TextureCoordinate1 = textureLowerRight;
Vertices[3].Position = UpperRight;
Vertices[3].TextureCoordinate1 = textureUpperRight;
// Set the index buffer for each vertex, using
// clockwise winding
Indexes[0] = 0;
Indexes[1] = 1;
Indexes[2] = 2;
Indexes[3] = 2;
Indexes[4] = 1;
Indexes[5] = 3;
}
}
}
main game code
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace TexturedQuad
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
Quad quad;
VertexDeclaration quadVertexDecl;
Matrix View, Projection;
protected override void Initialize()
{
quad = new Quad(Vector3.Zero, Vector3.Backward, Vector3.Up, 1, 1);
View = Matrix.CreateLookAt(new Vector3(0, 0, 2), Vector3.Zero,
Vector3.Up);
Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.PiOver4, 4.0f / 3.0f, 1, 500);
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
Texture2D texture1;
BasicEffect quadEffect;
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
texture1 = Content.Load<Texture2D>("Glass");
quadEffect = new BasicEffect(graphics.GraphicsDevice, null);
quadEffect.EnableDefaultLighting();
quadEffect.World = Matrix.Identity;
quadEffect.View = View;
quadEffect.Projection = Projection;
quadEffect.TextureEnabled = true;
quadEffect.Texture = texture1;
quadVertexDecl = new VertexDeclaration(graphics.GraphicsDevice,
VertexMultitextured.VertexElements);
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back ==
ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
GraphicsDevice.VertexDeclaration = quadVertexDecl;
quadEffect.Begin();
foreach (EffectPass pass in quadEffect.CurrentTechnique.Passes)
{
pass.Begin();
GraphicsDevice.DrawUserIndexedPrimitives
<VertexMultitextured>(
PrimitiveType.TriangleList,
quad.Vertices, 0, 4,
quad.Indexes, 0, 2);
pass.End();
}
quadEffect.End();
base.Draw(gameTime);
}
}
}