Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2011, 11:36   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию XNA: DrawPrimitives()

Итак, я пытаюсь нарисовать линию с помощью DrawPrimitives(). Информации по этой функции в сети очень мало, практически во всех примерах используется DrawUserPrimitives(). Но линий весьма много, мне нужен быстрый вариант.

Я сделал класс-наследник от Control, и в нём рисую всю графику. Но вместо долгожданной линии я вижу либо чёрную заливку, либо чёрно-зелёный градиент, либо чёрно-серый градиент (практически случайным образом).

Использую XNA 3.1.



Код:
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace SimpleLine
{
	using Color = Microsoft.Xna.Framework.Graphics.Color;

	class GraphicControl: Control
	{
		GraphicsDevice device;
		VertexDeclaration declaration;
		BasicEffect effect;
		VertexBuffer buffer;

		VertexPositionColor[] data =
		{
			new VertexPositionColor (new Vector3 (0, 0, 0), Color.Red),
			new VertexPositionColor (new Vector3 (100, 100, 0), Color.Red),
		};
		
		public GraphicControl ()
		{
			MinimumSize = new Size (1, 1);
			PresentationParameters parameters = new PresentationParameters ();
			parameters.BackBufferCount = 1;
			device = new GraphicsDevice (GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, Handle, parameters);

			declaration = new VertexDeclaration (device, VertexPositionColor.VertexElements);
			buffer = new VertexBuffer (device, VertexPositionColor.SizeInBytes*data.Length, BufferUsage.WriteOnly);
			buffer.SetData<VertexPositionColor> (data);
			effect = new BasicEffect (device, null);
			effect.VertexColorEnabled = true;
		}

		protected override void OnPaint (PaintEventArgs e)
		{
			device.Clear (Color.Black);
			device.RenderState.CullMode = CullMode.None;
			effect.World = Matrix.Identity;
			effect.View = Matrix.CreateLookAt (new Vector3 (0, 0, 1), Vector3.Zero, Vector3.Up);
			effect.Projection = Matrix.CreateOrthographicOffCenter (-100, 100, -100, 100, -100, 100);

			effect.CommitChanges ();
			effect.Begin ();
			foreach (EffectPass pass in effect.CurrentTechnique.Passes)
			{
				pass.Begin ();
				device.VertexDeclaration = declaration;
				device.Vertices[0].SetSource (buffer, 0, VertexPositionColor.SizeInBytes);
				device.DrawPrimitives (PrimitiveType.LineList, 0, data.Length);
				pass.End ();
			}
			effect.End ();

			device.Present ();
			base.OnPaint (e);
		}

		~GraphicControl ()
		{
			device.Dispose ();
		}
	}
}
ds.Dante вне форума Ответить с цитированием
Старый 29.06.2011, 17:43   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

как минимум если рисуется PrimitiveType.LineList
т.е ожидается Список линий
то кол-во надо указывать не data.Length, а реальное кол-во линий которые должны нарисоваться, т.е 1 линия в этом случае

ну и матрицу проекции нормальную сделай
если рисуешь во всей доступной области то это будет как-то так
Код:
effect.Projection = Matrix.CreateOrthographicOffCenter(ClientRectangle.Left, ClientRectangle.Right, ClientRectangle.Bottom, ClientRectangle.Top, -1, 1);
Кодом помочь не могу т.к у меня xna 4, разница будет слишком большая

Последний раз редактировалось m0nax; 29.06.2011 в 17:46.
m0nax вне форума Ответить с цитированием
Старый 29.06.2011, 17:59   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

На меня снизошло озарение. :)

После недели совокупления XNA с моим мозгом я смог таки сделать из рабочего примера DrawUserPrimitives рабочий пример DrawPrimitives.

Привожу код контрола, если кому-то вдруг понадобится. Матрицы я не трогаю, всё рисую в квадрате (-1; -1; 1; 1).

Код:
using System.Drawing;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

using Color = Microsoft.Xna.Framework.Graphics.Color;

namespace SimpleLine
{
	class Graphics: Control
	{
		GraphicsDevice device;
		VertexDeclaration declaration;
		BasicEffect effect;
		PresentationParameters parameters = new PresentationParameters ();
		VertexBuffer buffer;

		VertexPositionColor[] data =
		{
			new VertexPositionColor (new Vector3 (-0.5f, -0.5f, 0), Color.Red),
			new VertexPositionColor (new Vector3 (0.5f, 0.5f, 0), Color.Yellow),
		};
		
		public Graphics ()
		{
			Size = new Size (1, 1);
			SetStyle (ControlStyles.Opaque | ControlStyles.ResizeRedraw, true);

			device = new GraphicsDevice (GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, Handle, parameters);
			declaration = new VertexDeclaration (device, VertexPositionColor.VertexElements);
			buffer = new VertexBuffer (device, VertexPositionColor.SizeInBytes * data.Length, BufferUsage.None);
			buffer.SetData<VertexPositionColor> (data);
			effect = new BasicEffect (device, null);
			effect.VertexColorEnabled = true;
		}

		protected override void OnPaint (PaintEventArgs e)
		{
			device.Vertices[0].SetSource (buffer, 0, VertexPositionColor.SizeInBytes);
			device.VertexDeclaration = declaration;

			device.Clear (Color.Black);
			effect.Begin ();
			foreach (EffectPass pass in effect.CurrentTechnique.Passes)
			{
				pass.Begin ();
				device.DrawPrimitives (PrimitiveType.LineList, 0, data.Length / 2);
				pass.End ();
			}
			effect.End ();

			device.Present ();
			base.OnPaint (e);
		}

		protected override void OnResize (System.EventArgs e)
		{
			if (Width>0 && Height>0 && device!=null)
			{
				parameters.BackBufferWidth = Width;
				parameters.BackBufferHeight = Height;
				device.Reset (parameters);
			}
			base.OnResize (e);
		}

		~Graphics ()
		{
			device.Dispose ();
		}
	}
}
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XNA dampirik Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 22.06.2011 01:59
C# и XNA, посоветуйте литературу Пепел Феникса Общие вопросы .NET 21 29.03.2011 02:54
XNA 4, C# stck C# (си шарп) 1 01.02.2011 04:28
XNA программирование игр на C# sergeybr Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 30.06.2010 13:52
C# XNA Cpluser Общие вопросы .NET 1 19.12.2009 15:07