在HLSL中分离不同类型的缓冲区

时间:2014-04-10 01:45:39

标签: directx direct3d hlsl directx-11

是否可以分离传递给HLSL着色器的不同类型的数据?

例如,我见过的大多数教程都将缓冲区设置为

 struct vertin{
    float4 position: POSITION;
    float2 text    : TEXCOORD;
    float4 norm    : NORMAL:
 }

我想要做的是分别传递每个数据,而不创建一个结构来将所有内容保持在一起,从而将位置顶点与纹理分开,然后分别传递每个数据。另外,着色器如何能够判断哪个法线对应于哪个顶点和纹理?

我认为我所考虑的非常类似于OPENGL在传递到着色器时如何分别绑定每个顶点缓冲区,纹理缓冲区和普通缓冲区。 HLSL可以做同样的事情,怎么做?

我也在使用DirectX 11。

1 个答案:

答案 0 :(得分:-1)

是的,你可以。

在DirectX app中,将每个变量定义为struct

struct CBNeverChanges
{
    XMMATRIX mView;
};

struct CBChangeOnResize
{
    XMMATRIX mProjection;
};
在Shader文件中

,将每个变量定义为cbuffer

cbuffer cbNeverChanges : register( b0 )
{
    matrix View;
};

cbuffer cbChangeOnResize : register( b1 )
{
    matrix Projection;
};

使用CreateBuffer创建内容缓冲区

D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(CBNeverChanges);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &bd, NULL, &g_pCBNeverChanges );

使用UpdateSubresource更新着色器变量。

CBNeverChanges cbNeverChanges;
cbNeverChanges.mView = XMMatrixTranspose( g_View );
g_pImmediateContext->UpdateSubresource( g_pCBNeverChanges, 0, NULL, &cbNeverChanges, 0, 0 );

<强>更新 如果您甚至不想使用结构,请尝试以下代码。

// Shader variables
XMMATRIX mView;

// pointer to constant buffer
ID3D11Buffer* g_pCBChangeOnResize = NULL;

// Create constant buffer
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(XMMATRIX);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &bd, NULL, &g_pCBNeverChanges );

// Update shader variable
mView = XMMatrixTranspose( g_View );
g_pImmediateContext->UpdateSubresource( g_pCBNeverChanges, 0, NULL, &mView, 0, 0 );