0

在 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)。

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


4

1 回答 1

2

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

您应该在开始效果之前移动您的设置值,或者调用类似 yourshader.Apply()

于 2013-03-30T13:52:38.630 回答