【发布时间】:2016-10-23 20:28:11
【问题描述】:
我是DirectX11的新手,最近我决定使用VS2015来运行代码。
我尽量不使用EffectFrameWork11,但是使用时有一种非常不愉快的体验。
我尝试更改常量缓冲区中的值,没有EffectFramWork,我必须使用映射函数,伪代码就像:
D3D11_MAPPED_SUBRESOURCE mapResource;
ConstBuffer* constStruct = nullptr;
auto result = m_d3dContext->Map(m_constantBuffer, 0, D3D11_MAP_WRITE_DISCARD,
0, &mapResource);
if (FAILED(result))
{
d3dHelper::ShowResultMessage(result);
return;
}
constStruct = (ConstBuffer*)mapResource.pData;
constStruct->word = world;
constStruct->view = view;
constStruct->proj = proj;
m_d3dContext->Unmap(m_constantBuffer, 0);
m_d3dContext->VSSetConstantBuffers(0, 1, &m_constantBuffer);
m_d3dContext->DrawIndexed(indexCount, indexOffset, vertexOffset);
好的,它工作得很好,但是正如你所看到的,我必须用 C++ 代码和 HLSL 代码编写两个相同的结构:
c++ 代码如下:
struct ConstBuffer
{
XMMATRIX word;
XMMATRIX proj;
XMMATRIX view;
};
HLSL 代码如下:
cbuffer cbPerObject : register(b0)
{
matrix worldMatrix;
matrix projMatrix;
matrix viewMatrix;
}
那么,有没有什么方便的方法可以用 Constant Buffer 更新成员?
【问题讨论】:
-
你应该看看DirectX Tool Kit
-
谢谢朋友,我看过了。不过就是用了同样的方法。那么有没有别的方法呢?
-
为什么不使用
EffectFrameWork11?我认为更新数据使用EffectFrameWork11比直接使用dx11方便。而且DXTK也不错。 -
好吧,只是因为我是新手,我想知道是否有新的方法。我在 DirectXTK 中简单地扫描了一下,它也使用了 Map Function。
-
恕我直言,最好不要使用 EffectFramework11 或 DirectXTK 和类似的库。它们又大又笨重,尤其是 fx 框架是基于已经被微软扼杀的技术。如果您手动执行它,它还可以为您的应用程序提供更多原始功能......唯一方便的是您可以从着色器方便地设置通道和纹理,但最终我认为您会写出比 fx 更好的东西框架曾经是
标签: directx-11