2009-08-28 8 views
0

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

Теперь я пытаюсь получить тот же результат с нетрансформированными вершинами, но я не получаю никаких визуальных эффектов на экране. Я изменил свой 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); 

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

EDIT: Теперь я получил его, освещение было включено, ошибка глупого новичка. Спасибо за вашу помощь!

ответ

1

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

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

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

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

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

Set

pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); 

или

pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); 

, чтобы проверить эту гипотезу.

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

Edit2:

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

т.е.

pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 

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

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

И проверьте, чтобы увидеть, если ваши полигоны оказывают черный.

+0

Хороший вопрос, я отключил проверку Z-буфера, но проблема все еще остается. –

0

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

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); 
+0

Это не ответ, это часть вопроса! Текст должен быть отредактирован в вопрос, и ответ удаляется. – unwind

+0

Согласен, но ссылки для удаления нет. –

 Смежные вопросы

  • Нет связанных вопросов^_^