powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Manage DirectX
4 сообщений из 4, страница 1 из 1
Manage DirectX
    #35613224
sever221mar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывожу 3D объект (сферу, куб или другой, образованный треугольниками).
Необходимо отрисовать этот объект как закрашенный (FillMode = Solid) и показать сферху каркас (FillMode = WireFrame), т.е. сразу в двух режимах.
Спасибо.
...
Рейтинг: 0 / 0
Manage DirectX
    #35621505
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Manage DirectX
    #35629758
sever221mar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пётр Седов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
Manage DirectX
    #35631342
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Manage DirectX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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