【发布时间】: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 的代码会很有用