繁体   English   中英

如何创建3D边框? (HLSL Direct 3d 11,)

[英]how do i create 3d bounding box? (Direct 3d 11, HLSL)

我第一次使用Direct 3D,我正在寻找一种表示边界框(矩形/圆柱体/球体)的方法。 如何勾勒边框? 这是着色器,还是我使用其他东西来创建轮廓形状?

查斯特

最简单的方法是使用线列表创建单位线框边界体积。 使用变换矩阵,您可以围绕3D世界中的任何对象缩放,平移或旋转体积。

为此,需要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;
}

多维数据集VB和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
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM