Direct3D8 z-buffer trouble
От: Dejvavu Беларусь  
Дата: 21.08.02 03:49
Оценка:
Здравствуйте.
У меня такая проблема — при рендеринге видимость объектов становится зависимой от того, в каком порядке их рендерить. То есть если более дальний объект перекрывается более близким, но отредререн позже, то он все равно виден.. хотя и не должен вроде
Делаю я это:
//init....
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
//....
//render
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(51,51,51),1.0f,0L);
// дальше рендерятся объекты.

Вот. Такая проблема.
Кстати, объекты я создаю сам как вертексбуферы, не знаю, может быть дело в этом?
Re: Direct3D8 z-buffer trouble
От: IgorK Россия  
Дата: 21.08.02 04:34
Оценка:
Здравствуйте Dejvavu, Вы писали:

D>Здравствуйте.

D>У меня такая проблема — при рендеринге видимость объектов становится зависимой от того, в каком порядке их рендерить. То есть если более дальний объект перекрывается более близким, но отредререн позже, то он все равно виден.. хотя и не должен вроде
D>Делаю я это:
D>
D>//init....
g_pd3dDevice->>SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
D>//....
D>//render
g_pd3dDevice->>Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(51,51,51),1.0f,0L);
D>// дальше рендерятся объекты.
D>

D>Вот. Такая проблема.

Покажи как инициализируется структура D3DPRESENT_PARAMETERS.

D>Кстати, объекты я создаю сам как вертексбуферы, не знаю, может быть дело в этом?


Какой формат вертекса используется?
Re[2]: Direct3D8 z-buffer trouble
От: Dejavu Беларусь  
Дата: 21.08.02 04:46
Оценка:
После двух бессоных ночей даже никнейм выходит из под контроля)
Здравствуйте IgorK, Вы писали:

IK>Покажи как инициализируется структура D3DPRESENT_PARAMETERS.


D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed   = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice);

IK>Какой формат вертекса используется?
struct RO_VERTEX
{
    D3DXVECTOR3 p;
    D3DXVECTOR3 n;
    D3DCOLOR    c;
    float tu,tv;
} ;


и еще — все RenderStates по умолчанию, кроме D3DRS_AMBIENT (0xcccccc) и D3DRS_LIGHTING (FALSE)
Кстати — дополнительный вопрос — существуют ли в Direct3D8 ввобще методы работы с z-буфером? (Потому как кроме упоминания D3DRS_ZENABLE я так ничего и не встретил...)
Re[3]: Direct3D8 z-buffer trouble
От: IgorK Россия  
Дата: 21.08.02 06:21
Оценка:
Здравствуйте Dejavu, Вы писали:

На первый взгляд — все ок. Если код не большой — кинь сюда куски кода где проиходит инициализация (то что казается D3D), заполнение вертекс буфферов и отрисовка. Если большой — кидай на мыло (указано в моем профиле). Будем смотреть скурпулезно :)

D>Кстати — дополнительный вопрос — существуют ли в Direct3D8 ввобще методы работы с z-буфером? (Потому как кроме упоминания D3DRS_ZENABLE я так ничего и не встретил...)


Сам не пробовал (я только учусь), но, помоему, добраться до Z-буфера можно так:

IDirect3DDevice8::GetDepthStencilSurface()

Только надо помнить, что формат Z-буфера (а точнее depth-буфера) не универсальный, т.е. device-depended.
Re[4]: Direct3D8 z-buffer trouble
От: Dejavu Беларусь  
Дата: 21.08.02 19:49
Оценка:
Здравствуйте IgorK, Вы писали:

IK>На первый взгляд — все ок. Если код не большой — кинь сюда куски кода где проиходит инициализация (то что казается D3D), заполнение вертекс буфферов и отрисовка. Если большой — кидай на мыло (указано в моем профиле). Будем смотреть скурпулезно


У меня получилось!!!!
Весь прикол был всего лишь в одной строке.

    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/3.0f,1.33333f, np, fp ); //вот в этой!
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );


Так вот, параметр np был у меня всю жизнь ноль. Случайно, подготавливая код чтобы сюда кинуть, я его поменял. На 1.0f — и все получилось!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.