C# Direct3D自定义着色器滞后几帧

C# Direct3D自定义着色器滞后几帧,c#,directx,direct3d,vertex-shader,C#,Directx,Direct3d,Vertex Shader,在C#Managed DirectX中,我在使纹理正确显示在梯形(四边形,一侧较小,似乎从透视角度看)上遇到了问题。我最终用一个自定义着色器解决了这个问题(不是我想要的解决方案,而是迄今为止唯一有效的解决方案)。但是现在的问题是,使用自定义着色器渲染的所有基本体都落后于其他基本体一帧或几帧。代码的关键部分概述如下: 顶点着色器: float4x4 WorldViewProj; struct VSData { float4 Position : POSITION0; float2

在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();
    }
}
Render():

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

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

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



我认为您的问题在于在开始和开始过程范围内设置值。开始意味着cpu应用管道的当前状态。包括着色器变量


您应该在begineffect之前移动设置值,或者调用类似于yourshader.Apply()的函数。

您可以使用PIX(现已弃用)或visual studio 2012捕获帧,并查看到底发生了什么。您可能需要为其他人提供更多代码才能看到错误。您是否在着色器的某个位置调用了Apply方法?你是否将着色器设置为管道?不,我没有调用apply方法,我不知道它。我也不知道如何将着色器设置为管道。我得研究一下。谢谢。我添加了更多代码,显示Managed DirectX将着色器应用到管道的位置,我相信这就是您所说的。着色器工作正常,只是它显示在大约3帧前的位置。Doh!我有种感觉就是这么简单。。。谢谢。我以前花了一些时间自己寻找这一个:)你应该看看使用SlimDX的Direct3D 11,一切都更加结构化和透明。
//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();