什么是 DirectX 9 中的数据流?
What is a data stream in DirectX 9?
我正在Direct3D9中练习绘图,遇到了一个小问题。
例如,d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));
中的第一个参数是指定"数据流",但我不知道那是什么。
我已经让它画出了我想要的形状,但我仍然不明白"数据流"是什么意思。
这在当时被称为"多流"顶点缓冲区。这基本上允许 GPU 在从多个顶点缓冲区绘制期间构建每个顶点。
使用 Direct3D 11 的简单示例(概念相同(是每个组件的不同 VB:
struct VertexStream1
{
float pos[3];
};
struct VertexStream2
{
float norm[3];
};
struct VertexStream3
{
float color[4];
}
可以通过输入布局来描述:
const D3D11_INPUT_ELEMENT_DESC InputElements[] =
{
// Semantic, SemanticIndex, Format, InputSlot, ...
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 2, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
在内部映射到顶点着色器输入,如下所示:
struct VSInputNmTx
{
float4 Position : SV_Position;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
在运行时,这需要您绑定三个顶点缓冲区,每个顶点缓冲区都可以有自己的"顶点步幅"。每个顶点缓冲区必须有足够的条目来匹配您正在绘制的顶点数。
ID3D11VertexBuffer* vertexBuffer[3] = …;
UINT vertexStride[3] = { sizeof(VertexStream1), sizeof(VertexStream2), sizeof(VertexStream3) };
UINT vertexOffset[3] = { 0, 0, 0 };
context->IASetVertexBuffers(0, 3, vertexBuffer, &vertexStride, &vertexOffset);
这不是现实世界用法的一个很好的例子,但它明白了这一点。这也是用于"实例化"的语法,基本上您可以为一个或多个流设置"循环"。
相关文章:
- 使来自线程的数据流对所有其他线程都可读
- 什么是 DirectX 9 中的数据流?
- 将数据流到字节数组中
- 使用 Python 连接到数据流
- 使用 N-API 将数据流式传输到 Node.js C++ 插件中
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- 如何将数据流添加到具有FFmpeg和C / C++的MXF(使用mpeg2video)文件中
- C 中的数据流
- 从QTcpSocket上的数据流中连续运行复杂算法的最佳Qt线程解决方案是什么
- 将数据流式传输到 protobuf 解析器 c++
- 用于大型数据流的通货紧缩压缩算法
- 为什么我的数据流在20或30行后开始重复
- 使用QtMultedia播放自定义avi数据流
- 数据流 Qt 到标准 c++ 代码
- 在数据流处理程序中获取segfault
- 如果缓冲区由数据流填充,则 C++ boost async_read_some被缓冲区阻止
- Mac 上高带宽数据流最有效的进程间通信方法是什么?
- 如何将数据流从 std::cout 发送到 gnuplot
- 将数据流写入磁盘的最快方法
- 将数据流式传输到 std::vector<double> 崩溃