Лучший отвечающий
DirectX и net.framework 4

Вопрос
-
Интересно когда же выпустят DirectX который будут работать корректно с net.framework 4 ?
или может уже что то придумали?
просто DirectX входит в курс обучения(с графикой) нашего факультета например (2d и 3d графика)
можно наверное xna использовать, но учебные примеры будут с использованием DirectX, как и лабораторные собственно
как же все таки быть.
2 декабря 2010 г. 9:14
Ответы
-
Нормально работать неизвестно когда будет.
Пока можно посмотреть такие ссылки (сам я их пока не смотрел):
http://code.msdn.microsoft.com/WindowsAPICodePack
XNA, к моему большому сожалению (я как раз преподаю курс компьютерной графики), не очень подходит, так как в нем нет нормальных встроенных примитивов.
Есть еще неплохие обертки для OpenGL.
- Предложено в качестве ответа iandreev 2 декабря 2010 г. 15:46
- Помечено в качестве ответа Abolmasov Dmitry 10 декабря 2010 г. 7:30
2 декабря 2010 г. 15:46
Все ответы
-
Нормально работать неизвестно когда будет.
Пока можно посмотреть такие ссылки (сам я их пока не смотрел):
http://code.msdn.microsoft.com/WindowsAPICodePack
XNA, к моему большому сожалению (я как раз преподаю курс компьютерной графики), не очень подходит, так как в нем нет нормальных встроенных примитивов.
Есть еще неплохие обертки для OpenGL.
- Предложено в качестве ответа iandreev 2 декабря 2010 г. 15:46
- Помечено в качестве ответа Abolmasov Dmitry 10 декабря 2010 г. 7:30
2 декабря 2010 г. 15:46 -
у меня вот небольшой пример, я пробовал подключить slimdx вместо directx, но попытка так и не удалась..
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.IO;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
Device d3d;
Mesh sfera;
Material sfera_material;
bool fl = true;
Texture sfera_texture;
float koef=10f;
public Form1()
{
InitializeComponent();
d3d = null;
SetStyle(ControlStyles.ResizeRedraw, true);
sfera = null;
sfera_texture = null;
}
public void OnIdle(object sender, EventArgs e)
{
Invalidate(); // Помечаем главное окно (this) как требующее перерисовки
}
private void Form1_Load(object sender, EventArgs e)
{
try
{ // Устанавливаем режим отображения трехмерной графики
PresentParameters d3dpp = new PresentParameters();
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = SwapEffect.Discard;
d3dpp.Windowed = true; // Выводим графику в окно
d3dpp.MultiSample = MultiSampleType.None; // Выключаем антиалиасинг
d3dpp.EnableAutoDepthStencil = true; // Разрешаем создание z-буфера
d3dpp.AutoDepthStencilFormat = DepthFormat.D16; // Z-буфер в 16 бит
d3d = new Device(0, // D3D_ADAPTER_DEFAULT - видеоадаптер по
// умолчанию
DeviceType.Hardware, // Тип устройства - аппаратный ускоритель
this, // Окно для вывода графики
CreateFlags.SoftwareVertexProcessing, // Геометрию обрабатывает CPU
d3dpp);
}
catch (Exception exc)
{
MessageBox.Show(this, exc.Message, "Ошибка инициализации");
Close(); // Закрываем окно
}
sfera = Mesh.Sphere(d3d, 0.5f, 50, 10);
sfera_material = new Material();
sfera_material.Diffuse = Color.Yellow;
sfera_material.Specular = Color.White;
radioButton1.Enabled = true;
// FileStream textureFile = new FileStream("FROG.BMP", FileMode.Open);
/* sfera_texture = Texture.FromStream(d3d,
textureFile, // Поток данных с текстурой
0, // Будем использовать как обычную текстуру
Pool.Managed); // Область памяти для размещения текстуры
textureFile.Close();*/
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Очищаем буфер глубины и дублирующий буфер
d3d.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Azure, 1.0f, 0);
d3d.BeginScene();
SetupProekcii();
if (fl)
d3d.RenderState.FillMode = FillMode.Solid;
else
d3d.RenderState.FillMode = FillMode.WireFrame;
d3d.Material = sfera_material;
// В качестве текстурных координат берем вектор нормали
// d3d.TextureState[0].TextureCoordinateIndex =
// (int)TextureCoordinateIndex.CameraSpaceNormal;
// d3d.SetTexture(0, sfera_texture);
d3d.Transform.World = Matrix.Scaling(koef/10f,koef/10f,koef/10f)* Matrix.RotationX((float)Math.PI / 6) * Matrix.Translation(new Vector3(0, 0, 5f));
sfera.DrawSubset(0);
d3d.EndScene();
//Показываем содержимое дублирующего буфера
d3d.Present(); }
private void SetupProekcii()
{
// Устанавливаем параметры источника освещения
// Устанавливаем параметры источника освещения
d3d.Lights[0].Enabled = true; // Включаем нулевой источник освещения
d3d.Lights[0].Diffuse = Color.White; // Цвет источника освещения
d3d.Lights[0].Position = new Vector3(0, 0, 0); // Задаем координаты
d3d.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 50.0f);
}
private void radioButton2_Click(object sender, EventArgs e)
{
fl = false;
this.Invalidate();
}
private void radioButton1_Click(object sender, EventArgs e)
{
fl = true;
this.Invalidate();
}
private void цветToolStripMenuItem_Click(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
sfera_material.Diffuse = colorDialog1.Color;
}
private void текстураToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
FileStream textureFile = new FileStream(openFileDialog1.FileName, FileMode.Open);
sfera_texture= Texture.FromStream(d3d,
textureFile, // Поток данных с текстурой
0, // Будем использовать как обычную текстуру
Pool.Managed); // Область памяти для размещения текстуры
textureFile.Close(); }
}
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
koef = hScrollBar1.Value;
this.Invalidate();
}
}
}
вот я подключил в этот проект slimDX
http://ipicture.ru/uploads/20101204/O2djHPfu.png объекты вроде как существуют как и существовали..
а вот методы и сво-ва не все http://ipicture.ru/uploads/20101204/Wf5w1oRF.png может что неправильно?
3 декабря 2010 г. 23:27 -
Потому что названия функций, методов и свойст не точно совпадают в slimDX и directx, например:
d3d.RenderState.FillMode = FillMode.Solid; заменить на d3d.SetRenderState(RenderState.FillMode, FillMode.Solid);
и так далее..
Вот весь код:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using SlimDX; using SlimDX.Direct3D9; using System.IO; namespace WindowsFormsApplication33 { public partial class Form1 : Form { Device d3d; Mesh sfera; Material sfera_material; bool fl = true; Texture sfera_texture; float koef = 10f; public Form1() { InitializeComponent(); d3d = null; SetStyle(ControlStyles.ResizeRedraw, true); sfera = null; sfera_texture = null; } public void OnIdle(object sender, EventArgs e) { Invalidate(); // Помечаем главное окно (this) как требующее перерисовки } private void Form1_Load(object sender, EventArgs e) { try { // Устанавливаем режим отображения трехмерной графики PresentParameters d3dpp = new PresentParameters(); d3dpp.BackBufferCount = 1; d3dpp.SwapEffect = SwapEffect.Discard; d3dpp.Windowed = true; // Выводим графику в окно d3dpp.Multisample = MultisampleType.None; // d3dpp.MultiSample = MultiSampleType.None; // Выключаем антиалиасинг d3dpp.EnableAutoDepthStencil = true; // Разрешаем создание z-буфера // d3dpp.AutoDepthStencilFormat = DepthFormat.D16; // Z-буфер в 16 бит d3dpp.AutoDepthStencilFormat = Format.D16; d3d = new DeviceEx(new Direct3DEx(), 0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, d3dpp); //d3d = new Device(0, // D3D_ADAPTER_DEFAULT - видеоадаптер по // // умолчанию // DeviceType.Hardware, // Тип устройства - аппаратный ускоритель // this, // Окно для вывода графики // CreateFlags.SoftwareVertexProcessing, // Геометрию обрабатывает CPU // d3dpp); } catch (Exception exc) { MessageBox.Show(this, exc.Message, "Ошибка инициализации"); Close(); // Закрываем окно } //sfera = Mesh.Sphere(d3d, 0.5f, 50, 10); sfera = Mesh.CreateSphere(d3d, 0.5f, 50, 10); sfera_material = new Material(); sfera_material.Diffuse = Color.Yellow; sfera_material.Specular = Color.White; radioButton1.Enabled = true; // FileStream textureFile = new FileStream("FROG.BMP", FileMode.Open); /* sfera_texture = Texture.FromStream(d3d, textureFile, // Поток данных с текстурой 0, // Будем использовать как обычную текстуру Pool.Managed); // Область памяти для размещения текстуры textureFile.Close();*/ } private void Form1_Paint(object sender, PaintEventArgs e) { // Очищаем буфер глубины и дублирующий буфер d3d.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Azure, 1.0f, 0); d3d.BeginScene(); SetupProekcii(); if (fl) //d3d.RenderState.FillMode = FillMode.Solid; d3d.SetRenderState(RenderState.FillMode, FillMode.Solid); else // d3d.RenderState.FillMode = FillMode.WireFrame; d3d.SetRenderState(RenderState.FillMode, FillMode.Wireframe); d3d.Material = sfera_material; // В качестве текстурных координат берем вектор нормали // d3d.TextureState[0].TextureCoordinateIndex = // (int)TextureCoordinateIndex.CameraSpaceNormal; // d3d.SetTexture(0, sfera_texture); // d3d.Transform.World = Matrix.Scaling(koef / 10f, koef / 10f, koef / 10f) * Matrix.RotationX((float)Math.PI / 6) * Matrix.Translation(new Vector3(0, 0, 5f)); d3d.SetTransform(TransformState.World, Matrix.Scaling(koef / 10f, koef / 10f, koef / 10f) * Matrix.RotationX((float)Math.PI / 6) * Matrix.Translation(new Vector3(0, 0, 5f))); sfera.DrawSubset(0); d3d.EndScene(); //Показываем содержимое дублирующего буфера d3d.Present(); } private void SetupProekcii() { // Устанавливаем параметры источника освещения // Устанавливаем параметры источника освещения d3d.EnableLight(0, true); Light l = d3d.GetLight(0); l.Diffuse = Color.White; l.Position = new Vector3(0, 0, 0); //d3d.SetLight(0, l); //d3d.Lights[0].Enabled = true; // Включаем нулевой источник освещения // d3d.Lights[0].Diffuse = Color.White; // Цвет источника освещения //d3d.Lights[0].Position = new Vector3(0, 0, 0); // Задаем координаты // d3d.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 50.0f); d3d.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1.0f, 50.0f)); } private void radioButton2_Click(object sender, EventArgs e) { fl = false; this.Invalidate(); } private void radioButton1_Click(object sender, EventArgs e) { fl = true; this.Invalidate(); } private void цветToolStripMenuItem_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) sfera_material.Diffuse = colorDialog1.Color; } private void текстураToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { FileStream textureFile = new FileStream(openFileDialog1.FileName, FileMode.Open); sfera_texture = Texture.FromStream(d3d, textureFile, // Поток данных с текстурой 0, // Будем использовать как обычную текстуру Pool.Managed); // Область памяти для размещения текстуры textureFile.Close(); } } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { koef = hScrollBar1.Value; this.Invalidate(); } } }
Для связи [mail]7 декабря 2010 г. 13:01 -
Все проблема решена!
я скачал недавно вышедшие обновление к VS 2010 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=11ea69cb-cf12-4842-a3d7-b32a1e5642e2&displaylang=en
потом поставил последние DirectX
правда в Net.framework 4 я их не увидел, но так через браузер можно добавлять и все работает !
9 декабря 2010 г. 20:31