我现在正在研究简单的.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;
}
问题在于,每次渲染所有渲染过程都适用时,在着色器中,它们只处理最后已知的变量值 - 即wireframeColor,并且永远不会使用gridColor的值。我已经有这个问题了一段时间,所以可以肯定地说,它适用于每种类型的EffectVariables,从缓冲区到ShaderResources(例如UAViews),这真的很令人沮丧。效果变量总是倾向于采用最后一次调用的值。 DeviceContext.Flush()没有提供任何内容,但它看起来像是某种GPU命令的排队。
Only source of info for now, and it didn't work
看起来应用效果传递不会刷新变量更改。当我需要使用compute-shader工作时,我不得不手动将资源视图应用于着色器阶段的显式放置变量(通过寄存器索引)。
此效果实施问题?这不是必然的,我仍然可以使用低级恒定缓冲区分配,但是根本没有必要使用效果。
P.S。哦,并不建议使用diffuseColor字段,或其他只是乘以变量计数的方法。我需要在swapChain.Present()调用之间更改一个值并且只能更改多次。
感谢您的关注。
答案 0 :(得分:0)
切换到原生DX11着色器机制,在应用GPU命令时,Microsoft效果似乎遵循奇怪的逻辑。