如何创建 3D 边界框?(直接 3d 11,HLSL)
how do i create 3d bounding box? (Direct 3d 11, HLSL)
我是第一次使用直接3d,我正在寻找一种表示边界框(矩形/圆柱体/球体)的方法。如何概述边界框?这是一个着色器,还是我使用其他东西来创建轮廓形状?
追逐者
最简单的方法是使用线列表创建单位线框边界体积。使用变换矩阵,您可以围绕 3D 世界中的任何对象缩放、平移或旋转体积。
实现此目的需要 3 个主要部分:
- 设置了线列表顶点的常量 VB 和 IB(请记住,它需要以原点为中心,单位长度为 1),以及用于每个实例数据的 VB。
- 一种输入布局,它将转换矩阵作为每个实例的成员。
- 将转换矩阵应用于多维数据集的每个顶点的顶点着色器。(像素着色器只需输出提供的颜色)。
(应该注意的是,同样的原则也适用于球体、船体等)
我使用的着色器如下所示:
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
};
相关文章:
- 无法将结构注册为增强几何体3D点
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- OpenGL大的3D纹理(>2GB)非常慢
- 公开最直接的基类模板名称
- 是什么导致了Unity 3D中的"错误线程异常"?
- 为什么这种直接初始化有效?(C++17)
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 直接在RcppArmadillo中调用LAPACK例程
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 直接 2D 呈现到命令列表和打印:图片压缩
- 借助直接采样或布雷森汉姆类型采样在 3D 三角形上生成采样点
- 绘制大量三角形/高度图的更快方法(直接3D,C++)
- 如何创建 3D 边界框?(直接 3d 11,HLSL)