Самый простой преобразованный рисунок вершин с Direct3D

Я абсолютно новичок в DirectX и хотел бы нарисовать несколько непреобразованных примитивов с самой базовой конфигурацией Direct3D (в учебных целях). Я уже нарисовал несколько примитивов с преобразованными вершинами, то есть вершинами с установленным флагом D3DFVF_XYZRHW.

Теперь я пытаюсь получить тот же результат с непреобразованными вершинами, но не вижу никаких изображений на экране. Я изменил свой FVF и скорректировал вершины, но еще не установил матрицу преобразования (мир, вид, проекция). Нужно ли устанавливать какую-либо из этих матриц? Я бы предположил, что все будет работать так же, как с преобразованными вершинами, когда матрицы не заданы, но, очевидно, это не так.

Какая область (в мировых координатах) видна по умолчанию? Что мне нужно сделать, чтобы заставить его работать?

Это в основном то, что я делаю:

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);

Заранее спасибо!

РЕДАКТИРОВАТЬ: Теперь я понял, освещение было включено, глупая ошибка новичка. Спасибо за вашу помощь в любом случае!


person Community    schedule 28.08.2009    source источник


Ответы (2)


Что ж, если вы установите свой мир, представление и матрицы проекции на идентичность, то вы получите простой проход.

x будет находиться в диапазоне от -1 до 1
y будет находиться в диапазоне от -1 до 1
z будет находиться в диапазоне от 0 до 1 (этот бит может вызвать проблемы).

Если вы затем определите стандартные непреобразованные вершины и передадите их внутри этого диапазона, они отобразятся на экране.

Если это не поможет, опубликуйте код, и я посмотрю, что могу предложить.

Редактировать: у вас включена Z-буферизация? Потому что вы не очищаете свой Z-буфер, что может вызвать странные проблемы. Все будет отображаться позади этого и, следовательно, никогда не будет отображаться.

Набор

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

or

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

для проверки этой гипотезы.

Также очень важно научиться использовать PIX, а затем посмотреть, что происходит с вашим треугольником, когда он проходит через сцену.

Изменить2:

Возможно, ваша проблема связана с освещением. Попробуйте выключить освещение

ie

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

Также попробуйте изменить Clear на это:

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0);

И проверьте, отображаются ли ваши полигоны черным цветом.

person Goz    schedule 28.08.2009
comment
Хорошо, я отключил тест z-буфера, но проблема все еще остается. - person ; 28.08.2009

Это в основном то, что я делаю:

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);
person Community    schedule 28.08.2009
comment
Это не ответ, это часть вопроса! Текст следует отредактировать в вопросе, а ответ удалить. - person unwind; 28.08.2009
comment
Согласен, но ссылки на удаление нет. - person ; 28.08.2009