【问题标题】:Direct3D custom shader lagging a few frames behindDirect3D 自定义着色器滞后几帧
【发布时间】:2013-03-29 07:28:45
【问题描述】:

在 C# Managed DirectX 中让纹理正确显示在梯形(一侧较小的四边形,就像从透视图看一样)上时遇到问题。我最终用一个自定义着色器解决了它(不是我正在寻找的解决方案,但迄今为止唯一可行的解​​决方案)。然而现在的问题是,所有使用自定义着色器渲染的图元都落后于其他图元一帧或几帧。代码的关键部分概述如下:

顶点着色器:

float4x4 WorldViewProj;

struct VSData
{
    float4 Position : POSITION0;
    float2 TexCoord : TEXCOORD0;
};    

void Raw_VertexShader(in VSData IN, out VSData OUT)
{
    OUT.Position = mul(IN.Position, WorldViewProj);
    OUT.TexCoord = float2(IN.Position.x, IN.Position.z);
}

technique StretchTexture
{
    pass
    {
        VertexShader = compile vs_3_0 Raw_VertexShader();
    }
}

渲染():

//apply shader
manager.CPolyVertexShader.Technique = "StretchTexture";
manager.CPolyVertexShader.Begin(0);
manager.CPolyVertexShader.BeginPass();
//set shader's transformation matrix
manager.CPolyVertexShader.SetValue(manager.hWorldViewProj, device.Transform.World * device.Transform.View * device.Transform.Projection);
//draw the triangles
device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, CPolyIndices.Length, CPolyTriangles, CPolyIndices, true, CPolyVerts);
//deapply the shader
manager.CPolyVertexShader.EndPass();
manager.CPolyVertexShader.End();

manager 是一个处理 Direct3D 设备的类。 CPolyIndi​​ces 是索引数组。 CPolyVerts 是顶点数组。 CPolyTriangles 是要渲染的三角形的数量。

如您所见,在渲染之前,它将 WorldViewProj 设置为已分配给设备的矩阵,因此默认着色器和自定义着色器必须使用相同的转换矩阵。事实上,它并没有在错误的地方渲染,它只是渲染了它应该在几帧前的位置(很难准确说出它后面有多少帧,但看起来大约是 3)。

如果我简单地注释掉在绘制之间打开和关闭自定义着色器的行,问题就会消失。这是我第一次尝试在同一个渲染周期中使用自定义着色器和默认着色器,所以我可能错过了一些我什至没有意识到的东西。有人听说过这个吗?


【问题讨论】:

  • 您可以使用 PIX(现已弃用)或 Visual Studio 2012 来捕获帧并查看到底发生了什么。您可能需要提供更多代码让别人看到错误。
  • 您是否在某处调用着色器上的 Apply 方法?您是否将着色器设置为管道?
  • 不,我没有调用 apply 方法,我不知道。我也不知道将我的着色器设置为管道。我将不得不对此进行研究。谢谢。
  • 我添加了更多代码,显示托管 DirectX 将着色器应用于管道的位置,我相信这就是您所说的。着色器工作正常,只是它显示在它应该在 3 帧左右之前的位置。

标签: c# directx direct3d vertex-shader


【解决方案1】:

我认为您的问题是您将值 inside 设置为 Begin 和 BeginPass 范围。 Begin 表示 cpu 应用管道的当前状态。包括着色器变量。

你应该在 begineffect 之前移动你的 setvalue,或者调用类似 yourshader.Apply() 的东西

【讨论】:

  • 噢!我有一种感觉,就是这么简单……谢谢。
  • 过去我自己花了一些时间寻找这个 :) 你应该看看使用 SlimDX 的 Direct3D 11,一切都更加结构化和透明。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2012-09-28
  • 2012-10-12
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多