【问题标题】:DirectX11 Effects variable update - when is it happening?DirectX11 效果变量更新 - 何时发生?
【发布时间】:2013-12-10 00:06:02
【问题描述】:

我现在正在开发简单的 .NET 渲染器,并且已经坚持了一个月:

我正在使用由 SlimDX 开发人员为 DX11 编译的效果框架,并且在渲染循环内更新 EffectVariables 时一直遇到问题(我需要在每次 DrawIndexed 调用后更新矢量值)。代码看起来像(过滤):

public Vector4 wireframeColor = new Vector4();
public Vector4 gridColor = new Vector4();
wireColorVar = effect.GetVariableByName("wireframeColor").AsVector();

wireColorVar.Set(gridColor);
DrawIndexed(GridDomain);
foreach model in scene
{
  wireColorVar.Set(wireframeColor);
  DrawIndexed(modelDomain);
}

.fx 文件看起来像:

cbuffer ColorBuffer
{
    float4 wireframeColor;
    float4 diffuseColor;
};
float4 PVertex_Wire_PShader(PVertex_PInput input) : SV_TARGET
{
    return wireframeColor;
}

问题在于,每次应用所有这些渲染通道时,在着色器中它们只处理最后一个已知的变量值 - 即线框颜色,而从不处理 gridColor 的值。这个问题我已经有一段时间了,所以可以肯定地说,它适用于每种类型的 EffectVariables,从缓冲区到 ShaderResources(例如 UAViews),这真的很令人沮丧。效果变量总是倾向于采用最后一个调用的值。 DeviceContext.Flush() 什么也没提供,但它确实看起来像是某种 GPU 命令的排队。

Only source of info for now, and it didn't work

看起来应用效果通道不会刷新变量更改。当我需要计算着色器工作时,我必须手动将资源视图应用到着色器阶段的显式放置变量(通过寄存器索引)。

这是特效实现的问题吗?这不是不可避免的,我仍然可以使用低级的常量缓冲区分配,但是根本没有使用效果的意义。

附:哦,不建议使用diffuseColor 字段,或其他仅将变量计数相乘的方法。我需要在 swapChain.Present() 调用之间多次更改一个且唯一的变量的值。

感谢您的关注。

【问题讨论】:

  • 您在绘制代码中调用 EffectPass.Apply 吗?查看 DrawIndexed 的代码会很有用

标签: c# effects slimdx


【解决方案1】:

切换到原生 DX11 着色器机制,微软效果在应用 GPU 命令时似乎遵循奇怪的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多