Xna Pix,一系列问题I';我不明白

Xna Pix,一系列问题I';我不明白,xna,shader,hlsl,Xna,Shader,Hlsl,我被要求将我在这里提出的问题分开: 我认为两个和三个都适合同一个问题,因为解决一个问题可能有助于解决另一个问题。我正在调试着色器,似乎遇到了问题。首先,当我运行分析模式时,Pix似乎跳过了大量代码。这是一个使用F12捕获并关闭D3DX分析的实验。我必须关闭它,因为我正在使用XNA。有问题的着色器代码如下所示: float4 PixelShaderFunction(float2 OriginalUV : TEXCOORD0) : COLOR0 { // Get the depth

我被要求将我在这里提出的问题分开:

我认为两个和三个都适合同一个问题,因为解决一个问题可能有助于解决另一个问题。我正在调试着色器,似乎遇到了问题。首先,当我运行分析模式时,Pix似乎跳过了大量代码。这是一个使用F12捕获并关闭D3DX分析的实验。我必须关闭它,因为我正在使用XNA。有问题的着色器代码如下所示:

float4 PixelShaderFunction(float2 OriginalUV : TEXCOORD0) : COLOR0
{   

    // Get the depth buffer value at this pixel.  
    float4 color = float4 (0, 0,0,0);
    float4 finalColor = float4(0,0,0,0);

    float zOverW = tex2D(mySampler, OriginalUV);  
    // H is the viewport position at this pixel in the range -1 to 1.  
    float4 H = float4(OriginalUV.x * 2 - 1, (1 - OriginalUV.y) * 2 - 1,  
    zOverW, 1);  
    // Transform by the view-projection inverse.  
    float4 D = mul(H, xViewProjectionInverseMatrix);  
    // Divide by w to get the world position.  
    float4 worldPos = D / D.w;  

    // Current viewport position  
    float4 currentPos = H;  
    // Use the world position, and transform by the previous view-  
    // projection matrix.  
    float4 previousPos = mul(worldPos, xPreviousViewProjectionMatrix);  
    // Convert to nonhomogeneous points [-1,1] by dividing by w.  
    previousPos /= previousPos.w;  
    // Use this frame's position and last frame's to compute the pixel  
       // velocity.  
    float2 velocity = (currentPos - previousPos)/2.f;  

    // Get the initial color at this pixel.  
    color = tex2D(sceneSampler, OriginalUV);  
    OriginalUV += velocity;  
    for(int i = 1; i < 1; ++i, OriginalUV += velocity)  
    {  
        // Sample the color buffer along the velocity vector.  
        float4 currentColor = tex2D(sceneSampler, OriginalUV);  
        // Add the current color to our color sum.  
        color += currentColor;  
    } 
    // Average all of the samples to get the final blur color.  
    finalColor = color / xNumSamples;  


    return finalColor;
}
float4像素着色函数(float2 OriginalUV:TEXCOORD0):COLOR0
{   
//获取此像素处的深度缓冲区值。
float4颜色=float4(0,0,0,0);
float4 finalColor=float4(0,0,0,0);
float zOverW=tex2D(mySampler,OriginalUV);
//H是该像素处的视口位置,范围为-1到1。
float4h=float4(OriginalUV.x*2-1,(1-OriginalUV.y)*2-1,
zOverW,1);
//通过视图投影反转进行变换。
float4 D=mul(H,xviewprojectioninversetrix);
//除以w得到世界排名。
浮动4世界位置=D/D.w;
//当前视口位置
float4 currentPos=H;
//使用世界位置,并通过上一个视图进行变换-
//投影矩阵。
float4-previousPos=mul(worldPos,xPreviousViewProjectionMatrix);
//通过除以w转换为非齐次点[-1,1]。
previousPos/=previousPos.w;
//使用此帧的位置和最后一帧的位置来计算像素
//速度。
float2速度=(currentPos-previousPos)/2.f;
//获取此像素处的初始颜色。
颜色=tex2D(场景采样器,原版);
OriginalUV+=速度;
对于(int i=1;i<1;++i,OriginalUV+=速度)
{  
//沿速度向量对颜色缓冲区进行采样。
float4 currentColor=tex2D(场景采样器,OriginalUV);
//将当前颜色添加到我们的颜色总和中。
颜色+=当前颜色;
} 
//平均所有采样以获得最终模糊颜色。
最终颜色=颜色/xNumSamples;
返回最终颜色;
}
使用捕获的帧和调试像素时,我只能看到两条线在工作。它们是color=tex2D(sceneSampler,OriginalUV)和finalColor=color/xNumSamples。其余部分Pix只是跳过或不做

我还可以使用Pix进行实时调试吗?我想知道这种方法是否能透露更多信息


干杯,

看起来大部分着色器代码都在优化中(没有编译,因为它不相关)

最后,重要的是
finalColor
的返回值,该值由
color
xNumSamples
设置

// Average all of the samples to get the final blur color.  
finalColor = color / xNumSamples; 
我不确定
xNumSamples
设置在哪里,但您可以看到,与
color
相关的唯一行是
color=tex2D(sceneSampler,OriginalUV)(因此不会将其删除)

在此之前的每一行都是无关的,因为它将被该行覆盖

下面唯一的一位是for循环:

for(int i = 1; i < 1; ++i, OriginalUV += velocity)  
for(int i=1;i<1;++i,OriginalUV+=velocity)
但这将永远不会执行,因为从一开始,
i<1
就为false(i的起始值为1)

希望有帮助



为了回答第二个问题,我相信要实时调试着色器,您需要使用类似Nvidia的和。然而,这些都是在游戏之外运行的,所以结果并不总是有用的。

好吧,我认为对于循环线来说,我是在摆弄东西,所以我忘记了将值切换回来。我基本上是在尝试实现这里发现的运动模糊效果:我试图尽可能多地复制这种方法,但我担心编译器是否正在优化它,这种方法是不可能的;它在循环中使用这些数据。在修复循环后,你仍然有问题吗?啊,好吧,你是对的,我现在似乎得到了某种效果,所以可能可以从那里解决它。干杯