Direct3D自定义着色器落后几帧

时间:2013-03-29 07:28:46

标签: c# directx direct3d vertex-shader

我在使用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)。

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


1 个答案:

答案 0 :(得分:2)

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

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