[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
struct VertexPositionColor
{
	float4 Position : POSITION0;
	float4 Color : COLOR;
};
VertexPositionColor MyVertexShader(
	VertexPositionColor input,
	float3 position : POSITION1
	)
{
	input.Position.xyz += position;
	return input;
}
float4 MyPixelShader(float4 color : COLOR) : COLOR0
{
	return color;
}
technique HardwareInstancing
{
	pass Pass1
	{
		VertexShader = compile vs_3_0 MyVertexShader();
		PixelShader = compile ps_3_0 MyPixelShader();
	}
}
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; class MyGame : Game { VertexPositionColor[] vertices = new VertexPositionColor[]{ new VertexPositionColor(new Vector3(-0.1f, 0.1f, 0), Color.Blue), new VertexPositionColor(new Vector3(0.1f, 0.1f, 0), Color.White), new VertexPositionColor(new Vector3(0.1f, -0.1f, 0), Color.Red) }; Vector3[] instances = new Vector3[] { new Vector3(), new Vector3(0.1f, 0.1f, 0), new Vector3(0.2f, 0.2f, 0) }; //Graphics Device Objects Effect effect; VertexBuffer triangleVertexBuffer; IndexBuffer indexBuffer; DynamicVertexBuffer instanceVertexBuffer; public MyGame() { new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; } protected override void LoadContent() { effect = Content.Load<Effect>("HardwareInstancing"); triangleVertexBuffer = new VertexBuffer( GraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly ); triangleVertexBuffer.SetData<VertexPositionColor>(vertices); var index = new int[] { 0, 1, 2 }; indexBuffer = new IndexBuffer( GraphicsDevice, IndexElementSize.ThirtyTwoBits, index.Length, BufferUsage.WriteOnly ); indexBuffer.SetData<int>(index); instanceVertexBuffer = new DynamicVertexBuffer( GraphicsDevice, new VertexDeclaration( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 1) ), instances.Length, BufferUsage.WriteOnly); instanceVertexBuffer.SetData(instances); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice.SetVertexBuffers( new VertexBufferBinding(triangleVertexBuffer, 0, 0), new VertexBufferBinding(instanceVertexBuffer, 0, 1) ); GraphicsDevice.Indices = indexBuffer; instanceVertexBuffer.SetData(instances, 0, instances.Length, SetDataOptions.Discard); foreach (var pass in effect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawInstancedPrimitives( PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, vertices.Length / 3, instances.Length ); } } }