Direct3D自定义着色器落后几帧

本文关键字:几帧 自定义 Direct3D | 更新日期: 2023-09-27 18:06:21

在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设备的类。CPolyIndices是索引数组。cpolyvert是顶点数组。CPolyTriangles是要渲染的三角形数。

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

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


Direct3D自定义着色器落后几帧

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

你应该把setvalue移到begineffect之前,或者调用你的shader. apply ()