是否可以分离传递给HLSL着色器的不同类型的数据?
例如,我见过的大多数教程都将缓冲区设置为
struct vertin{
float4 position: POSITION;
float2 text : TEXCOORD;
float4 norm : NORMAL:
}
我想要做的是分别传递每个数据,而不创建一个结构来将所有内容保持在一起,从而将位置顶点与纹理分开,然后分别传递每个数据。另外,着色器如何能够判断哪个法线对应于哪个顶点和纹理?
我认为我所考虑的非常类似于OPENGL在传递到着色器时如何分别绑定每个顶点缓冲区,纹理缓冲区和普通缓冲区。 HLSL可以做同样的事情,怎么做?
我也在使用DirectX 11。
答案 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 );