我如何创建3D边界框? (直接3d 11,HLSL)

时间:2013-01-27 20:24:12

标签: c++ 3d hlsl direct3d11

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

chasester

1 个答案:

答案 0 :(得分:3)

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

实现这一目标需要3个主要部分:

  1. 设置了行列表顶点的常量VB和IB(记住它需要以原点为中心,单位长度为1),加上每个实例数据的VB。
  2. 一种输入布局,它将变换矩阵作为每个实例成员。
  3. 将变换矩阵应用于多维数据集的每个顶点的顶点着色器。 (像素着色器只需输出所提供的颜色)。
  4. (应该注意的是,同样的原理也适用于球体,船体等)

    我使用的着色器看起来像这样:

    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
    };
    
相关问题