Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Manage DirectX / 4 сообщений из 4, страница 1 из 1
23.10.2008, 21:57
    #35613224
sever221mar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Manage DirectX
Вывожу 3D объект (сферу, куб или другой, образованный треугольниками).
Необходимо отрисовать этот объект как закрашенный (FillMode = Solid) и показать сферху каркас (FillMode = WireFrame), т.е. сразу в двух режимах.
Спасибо.
...
Рейтинг: 0 / 0
28.10.2008, 20:09
    #35621505
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Manage DirectX
2 sever221mar:

Так рисуйте объект два раза, первый раз -- в режиме Solid, второй раз -- в режиме WireFrame. В чём проблема-то? Или Вас интересует как бороться с возникающим z-fighting-ом? В OpenGL для этого есть polygon offset:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// включить polygon offset
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset( 1 . 0 ,  0 . 000001 );

нарисовать грани (треугольники или четырёхугольники (quads))

// отключить polygon offset
glDisable(GL_POLYGON_OFFSET_FILL);

нарисовать рёбра (отрезки прямых)
В Direct3D 9 есть аналогичная функциональность -- см. D3DRS_SLOPESCALEDEPTHBIAS, D3DRS_DEPTHBIAS.

Кстати, а Managed DirectX (MDX) разве ещё не умер?
...
Рейтинг: 0 / 0
01.11.2008, 09:51
    #35629758
sever221mar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Manage DirectX
Пётр Седов2 sever221mar:

Так рисуйте объект два раза, первый раз -- в режиме Solid, второй раз -- в режиме WireFrame. В чём проблема-то? Или Вас интересует как бороться с возникающим z-fighting-ом? В OpenGL для этого есть polygon offset:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// включить polygon offset
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset( 1 . 0 ,  0 . 000001 );

нарисовать грани (треугольники или четырёхугольники (quads))

// отключить polygon offset
glDisable(GL_POLYGON_OFFSET_FILL);

нарисовать рёбра (отрезки прямых)
В Direct3D 9 есть аналогичная функциональность -- см. D3DRS_SLOPESCALEDEPTHBIAS, D3DRS_DEPTHBIAS.

Кстати, а Managed DirectX (MDX) разве ещё не умер?

Все это круто, но объекты рендерятся через Device, который один. Свойство FillMode в нем. Вы мне предлагаете создавать два устройства для отрисовки?
MDX давно умер, просто на XNA видеоадаптер не катит, т.к. минимум требуется поддержка PS 1.0.
...
Рейтинг: 0 / 0
02.11.2008, 02:29
    #35631342
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Manage DirectX
2 sever221mar:

sever221mar
Все это круто, но объекты рендерятся через Device, который один. Свойство FillMode в нем. Вы мне предлагаете создавать два устройства для отрисовки?

Нет, я предлагаю рисовать объект два раза, первый раз -- в режиме solid, второй раз -- в режиме wireframe. Код для Direct3D 9:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
inline void SetFillMode(D3DFILLMODE FillMode)
{
  HRESULT hr = s_pDevice->SetRenderState(D3DRS_FILLMODE, FillMode);
  assert(SUCCEEDED(hr));
}

inline void SetDepthBias(float DepthBias)
{
  HRESULT hr = s_pDevice->SetRenderState(D3DRS_DEPTHBIAS, *reinterpret_cast<DWORD*>(&DepthBias));
  assert(SUCCEEDED(hr));
}

inline void SetSlopeScaleDepthBias(float SlopeScaleDepthBias)
{
  HRESULT hr = s_pDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *reinterpret_cast<DWORD*>(&SlopeScaleDepthBias));
  assert(SUCCEEDED(hr));
}

inline void SetTextureFactor(D3DCOLOR TextureFactor)
{
  HRESULT hr = s_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, TextureFactor);
  assert(SUCCEEDED(hr));
}

void YieldTeapot();
void PaintTeapotWithEdges()
{
  assert(s_pTeapotVertBuf != NULL);
  assert(s_pTeapotIndexBuf != NULL);

  HRESULT hr;

  hr = s_pDevice->SetFVF(s_TeapotVertFormat);
  hr = s_pDevice->SetStreamSource( 0 , s_pTeapotVertBuf,  0 , sizeof(TeapotVert));
  hr = s_pDevice->SetIndices(s_pTeapotIndexBuf);

  // цвет объекта брать из texture factor
  hr = s_pDevice->SetTextureStageState( 0 , D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  hr = s_pDevice->SetTextureStageState( 0 , D3DTSS_COLORARG1, D3DTA_TFACTOR);

  // включить depth bias
  SetSlopeScaleDepthBias( 1 );

  // нарисовать грани
  SetFillMode(D3DFILL_SOLID);
  SetTextureFactor(D3DCOLOR_XRGB( 160 ,  160 ,  160 ));
  YieldTeapot();

  // отключить depth bias
  SetSlopeScaleDepthBias( 0 );

  // нарисовать рёбра
  SetFillMode(D3DFILL_WIREFRAME);
  SetTextureFactor(D3DCOLOR_XRGB( 255 ,  255 ,  255 ));
  YieldTeapot();

  hr = s_pDevice->SetStreamSource( 0 , NULL,  0 ,  0 );
  assert(SUCCEEDED(hr));
  hr = s_pDevice->SetIndices(NULL);
  assert(SUCCEEDED(hr));
}

#define LEN(Array) static_cast<int>(sizeof(Array) / sizeof(Array[ 0 ]))

void YieldTeapot()
{
  HRESULT hr = s_pDevice->DrawIndexedPrimitive(
    /*Type:*/D3DPT_TRIANGLELIST,
    /*BaseVertexIndex:*/ 0 ,
    /*MinIndex:*/ 0 ,
    /*NumVertices:*/LEN(s_TeapotVerts),
    /*StartIndex:*/ 0 ,
    /*PrimitiveCount:*/LEN(s_TeapotFaces)); // количество треугольников
  assert(SUCCEEDED(hr));
}
Результат -- см. приложенную картинку.

К сожалению, D3DRS_SLOPESCALEDEPTHBIAS поддерживается не везде, это надо проверять:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
D3DCAPS9 Caps;
hr = s_pDevice->GetDeviceCaps(&Caps);
assert(SUCCEEDED(hr));
if (Caps.RasterCaps & D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS)
{
  // D3DRS_SLOPESCALEDEPTHBIAS поддерживается
}

Если D3DRS_SLOPESCALEDEPTHBIAS не поддерживается, то для борьбы с z-fighting-ом (между гранями и рёбрами) придётся мухлевать с матрицей проекции.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Manage DirectX / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]