Как создать 3D ограничивающий прямоугольник? (Direct 3d 11, HLSL)

Я впервые использую прямой 3d и ищу способ представить ограничивающие прямоугольники (прямоугольники / цилиндры / сферы). Как мне наметить ограничивающую рамку? Это шейдер, или я использую что-то еще, чтобы создать контурную фигуру?

chasester

0

Решение

Самый простой способ — использовать список строк для создания ограничивающего тома каркаса устройства.
используя матрицу преобразования, вы можете масштабировать, переводить или вращать объем вокруг любого объекта в вашем трехмерном мире.

Выполнение этого требует 3 основных части:

  1. Постоянные VB и IB с установленными вершинами списка линий (помните, что он должен быть центрирован вокруг начала координат и иметь единичную длину 1), плюс VB для данных для каждого экземпляра.
  2. Структура ввода, которая принимает матрицу преобразования в качестве члена для каждого экземпляра.
  3. Вершинный шейдер, который применяет матрицу преобразования к каждой вершине куба. (пиксельный шейдер должен выводить только тот цвет, который указан).

(Следует отметить, что тот же принцип применим и к сферам, корпусам и т. Д.)

Шейдеры, которые я использую, выглядят так:

struct WIRE_VS_INPUT
{
float3 Position     : POSITION;
float4 Color        : COLOR0;
float3 Transform    : TRANSFORM;
float3 Size         : SIZE;
};

struct WIRE_VS_OUTPUT
{
float4 Position     : SV_POSITION;
float4 Color        : COLOR0;
};

WIRE_VS_OUTPUT WireBoxVS( WIRE_VS_INPUT Input )
{
WIRE_VS_OUTPUT Output;
Output.Position = mul(float4((Input.Position * Input.Size) + Input.Transform,1),g_mWorldViewProjection);
Output.Color = Input.Color;
return Output;
}

float4 WireBoxPS( WIRE_VS_OUTPUT Input ) : SV_TARGET
{
return Input.Color;
}

Куб В.Б. & Настройка IB:

const DirectX::XMFLOAT3 kWireCube[] =
{
DirectX::XMFLOAT3(-1,-1,-1),
DirectX::XMFLOAT3(1,-1,-1),
DirectX::XMFLOAT3(1,1,-1),
DirectX::XMFLOAT3(-1,1,-1),
DirectX::XMFLOAT3(-1,-1,1),
DirectX::XMFLOAT3(1,-1,1),
DirectX::XMFLOAT3(1,1,1),
DirectX::XMFLOAT3(-1,1,1)
};

const WORD kWireCubeIndices[] =
{
0,1,
1,2,
2,3,
3,0,

4,5,
5,6,
6,7,
7,4,

0,4,
1,5,
2,6,
3,7
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]