DirectX Z буфер работает неправильно - PullRequest
1 голос
/ 16 июня 2011

Моя проблема связана с тестом глубины в DirectX 9. Я пытаюсь визуализировать один объект в статической точке в игре, а другой - в точке, которую можно изменить на основе входных данных из DirectInput. Один из объектов удален почти на 500 единиц. При первом рисовании сцены два объекта отображаются правильно, но как только положение второго объекта изменяется (также перемещается камера), дополнительный объект рисуется поверх более близкого, несмотря на то, что имеется включенный тест глубины и правильные значения вблизи и значения в дальней плоскости. эта проблема заставила меня перебирать форумы (включая этот), чтобы найти ответ без удачи. Если кто-то может помочь, это будет высоко ценится.

EDIT:

Может быть, я немного неясен. Объекты отрисовываются правильно до того, как будут внесены какие-либо изменения в положение , но направление камеры можно изменить по желанию, и никаких побочных эффектов не произойдет. После изменения позиции объекты отображаются неправильно.

Обновление:

@ paul-jan: Я бы опубликовал код, но он разбросан по нескольким классам ... Буфер глубины - это просто автоматический буфер D3DFMT_D16, объявленный в D3DPRESENT_PARAMETERS. В соответствии с документами MSDN, он автоматически включен, записи включены, и функция D3DCMP_LESSEQUAL. Также модели загружаются из X-файлов, и они хорошо отображаются в DirectX Viewer.

@ vines: Интересная гипотеза. Преобразования разные, но только в мировой матрице. Мой инстинкт инстинкта заключается в том, что его в матрице вида Я работаю над реализацией, описанной в книге Введение в программирование трехмерных игр с DirectX 9.0c Фрэнка Д. Луны, которую я модифицировал в соответствии с моими целями, а именно вращение трех осей. Тем не менее, я, возможно, испортил свою реализацию.

Вот код ...

void BuildViewMatrix()
{    
    D3DXVec3Normalize(&f,&f);
    D3DXVec3Cross(&u,&f,&r);
    D3DXVec3Normalize(&u,&u);
    D3DXVec3Cross(&r,&u,&f);
    D3DXVec3Normalize(&r,&r);       
    w(0,0)=r.x;
    w(0,1)=r.y;
    w(0,2)=r.z;
    w(0,3)=p.x;
    w(1,0)=u.x;
    w(1,1)=u.y;
    w(1,2)=u.z;
    w(1,3)=p.y;
    w(2,0)=f.x;
    w(2,1)=f.y;
    w(2,2)=f.z;
    w(2,3)=p.z;
    w(3,0)=0.0f;
    w(3,1)=0.0f;
    w(3,2)=0.0f;
    w(3,3)=1.0f;
    D3DXMatrixInverse(&view,0,&w);
    w=l*w;
}

r = правый вектор, u = вектор вверх, f = прямой вектор, р = положение, w = мировая матрица, l = преобразование смещения локального пространства (моя собственная идея немного перевести вещи перед преобразованием мира).

Вся идея основана на использовании камеры для боевой игры звездного истребителя от третьего лица. Камера и ваш корабль «объединены» как один объект (отсюда и локальное пространственное преобразование), а матрица вида является обратной к мировой матрице корабля. Я не уверен, что это лучший способ реализовать это.

Есть идеи?

1 Ответ

0 голосов
/ 16 июня 2011

Догадка:

Похоже, что матрицы для двух объектов различаются: вы визуализируете первый объект с одной настройкой преобразования, затем изменяете его и визуализируете 2-й объект. Затем визуально 2-й объект проецируется там, где он должен быть, но масштаб z-координаты теперь искажен относительно того, что использовалось для 1-го объекта. Таким образом, вы «обманываете» Z-буфер - вы рисуете нужные пиксели, но проецируете их ближе, чем предполагалось.

...