DirectX 9 中的数据流是什么?
What is a data stream in DirectX 9?
我正在练习Direct3D9画图,运行遇到了点小问题
例如d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));
中的第一个参数是指定"data stream",但我不知道那是什么。
我已经画出了我想要的形状,但我还是不明白"data stream"是什么意思。
这在过去叫做 "Multistream" 顶点缓冲区。这基本上让 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;
};
在运行时,这需要您绑定三个 VertexBuffer,每个 VertexBuffer 都可以有自己的 'vertex stride'。每个顶点缓冲区必须有足够的条目来匹配您正在绘制的顶点数。
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);
This isn't a great example of real-world usage, but it gets the point across. This is also the syntax used for "Instancing" where basically you can set up a 'loop' for one or more of the streams.
我正在练习Direct3D9画图,运行遇到了点小问题
例如d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));
中的第一个参数是指定"data stream",但我不知道那是什么。
我已经画出了我想要的形状,但我还是不明白"data stream"是什么意思。
这在过去叫做 "Multistream" 顶点缓冲区。这基本上让 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;
};
在运行时,这需要您绑定三个 VertexBuffer,每个 VertexBuffer 都可以有自己的 'vertex stride'。每个顶点缓冲区必须有足够的条目来匹配您正在绘制的顶点数。
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);
This isn't a great example of real-world usage, but it gets the point across. This is also the syntax used for "Instancing" where basically you can set up a 'loop' for one or more of the streams.