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

标签 c++ 3d hlsl direct3d11

我是第一次使用直接 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
};

关于c++ - 我如何创建 3d 边界框? (直接 3d 11,HLSL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551831/

相关文章:

ide - 真正的 HLSL IDE/调试器

assembly - 如何将 asm 着色器编译为 fxo 文件?

c++ - constexpr 是编译器的 "hint"(如内联)还是 "a binding request"?

c++ - 通过 poco 和 ssl 发送邮件后 100% CPU 负载

javascript - Three.js - 如何选择灯光/相机

c# - 具有第 4 维标记特殊值的 3D 表面着色

c++ - IShellDisptach:为什么 FolderItemVerbs::Release() + CoUninitialize() 会崩溃?

c++ - 为什么使用 abs() 或 fabs() 而不是条件否定?

javascript - 如何使用 iTowns2 在浏览器中渲染点云数据

opengl - Shader的功能参数表现