【问题标题】:Shader Reflection With DirectX11DirectX11 的着色器反射
【发布时间】: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


【解决方案1】:

不,你很可能不能,而且,无论如何你都需要编写 Map/Unmap 代码。但是,有一点光,你可以从着色器反射中得到变量的字节位置,但我认为它对你没有多大帮助。在我的框架中,我只是填写了结构然后我有一个基本上看起来像这样的调用

gpu->CommitGPUResource<LetsSayAPointLight>(pointLightStruct);

它基本上就是你上面写的那样,所以不用担心,它并不难看,这是一种处理方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多