Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Managed DirectX. Появляются искажения..


Автор: Kurt 14.10.2005, 19:30
Возникла необходимость работы с Managed DirectX. (теперь буду спецом, блин. smile )
Сейчас делаю первые шаги - верчу подсвеченную пирамидку. Все сделано согласно туториалам, что шли вместе с DX9SDK.
Запускается приложение, а дальше два варианта развития событий:
1) все красиво отрисовывается. (показано в прикрепленном файле t0.jpg);
2) изображение искажается - появляются какие-то дополнительные плоскости, хотя в коде ничего подобного нет (файлы t1.jpg и t2.jpg).
Т.е. происходит следующее - при запуске спонтанно появляются вышеописанные искажения. Раз запущу - все хорошо. Закрою и снова запущу эту же программу - появляются какие-то левые плоскости.
Хотелось бы уточнить, это глюки у меня или у самого Managed DX? Кто-нибудь встречался с подобным? Как это решить?

З.Ы. Используется .NET Framework 2.0
Я все запаковал в архив вместе с самим проектом. На "красоту" кода не обращайте внимания - я просто тренируюсь. smile

Автор: mr.DUDA 14.10.2005, 19:49
У меня референсы на DirectX светятся жёлтым, хотя установлен DX SDK 9.0 (Summer 2004). Что не так ? smile
Добавлено @ 19:50
З.Ы. навскидку: может быть отключить _presentParams.EnableAutoDepthStencil = true; ?

Автор: Kurt 14.10.2005, 20:08
Цитата(mr @ 14.10.2005, 19:49)
У меня референсы на DirectX светятся жёлтым, хотя установлен DX SDK 9.0 (Summer 2004). Что не так ? smile

ну, поправь референсы в св-вах проекта. Нужны Microsoft.DirectX, Microsoft.DirectX.Direct3D и Microsoft.DirectX.Direct3DX.
Цитата

З.Ы. навскидку: может быть отключить  _presentParams.EnableAutoDepthStencil = true; ?

не. тогда вот на этой строчке:
Цитата
_device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0);

выкидывается Exception.
Да и в SDK-примерах _presentParams.EnableAutoDepthStencil поставлено в true.

Автор: -ser- 15.10.2005, 10:59
у меня во время выполнения выдает Microsoft.DirectX.Direct3D.InvalidCallException was unhandled в
Код

_device.DrawPrimitives( PrimitiveType.TriangleList, 0, _myPyramid.TriangleCount);

всегда при _myPyramid.TriangleCount = 18

Автор: mr.DUDA 15.10.2005, 11:58
Цитата(ser @ 15.10.2005, 10:59)
у меня во время выполнения выдает Microsoft.DirectX.Direct3D.InvalidCallException was unhandled в
Код
_device.DrawPrimitives( PrimitiveType.TriangleList, 0, _myPyramid.TriangleCount);
всегда при _myPyramid.TriangleCount = 18

Это потому что инициализация массива _vertexArray производится явно для каждого элемента, а не в цикле:
Код

            _vertexArray[0] = new My3DVertex(-1.0f, -1.0f, -1.0f, Color.Silver);
            _vertexArray[1] = new My3DVertex(-1.0f, -1.0f, 1.0f, Color.Silver);
            _vertexArray[2] = new My3DVertex(1.0f, -1.0f, 1.0f, Color.Silver);

// и так далее

и получается, что сколько ни указывай треугольников, но проинициализированы будут только первые 18 вершин - т.е. 6 полигонов, пирамида.

Пофиксить ошибку с искажениями можно так:
Код

    class MyPyramid
    {

// ...
        public int TriangleCount
        {
            get { return _vertexCount / 3; }
        }


Всё оказалось очень просто: метод
Код

             _device.DrawPrimitives(PrimitiveType.TriangleList, 0, _myPyramid.TriangleCount);

выводит заданное количество треугольников (т.к. PrimitiveType.TriangleList), а их количество равно кол-ву вершин делённому на 3; в твоём коде св-во MyPiramid.TriangleCount возвращало _vertexCount, то есть 18 вместо 6 -- в итоге получалось, что вершины для недостающих полигонов Direct3D брал извне границ вертексного буфера.

Автор: Kurt 15.10.2005, 18:27
Блин, mr.DUDA, ты абсолютно прав. Я лопухнулся.
Вот что бывает, когда ленишься вручную прописать property, а используешь Copy-Paste. smile
А я уже начал думать, что это глюки самой библиотеки.
Спасибо за помощь!
Буду разбираться дальше...

З.Ы. Думаю, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)