Xna Pix,一系列问题I';我不明白
我被要求将我在这里提出的问题分开: 我认为两个和三个都适合同一个问题,因为解决一个问题可能有助于解决另一个问题。我正在调试着色器,似乎遇到了问题。首先,当我运行分析模式时,Pix似乎跳过了大量代码。这是一个使用F12捕获并关闭D3DX分析的实验。我必须关闭它,因为我正在使用XNA。有问题的着色器代码如下所示:Xna Pix,一系列问题I';我不明白,xna,shader,hlsl,Xna,Shader,Hlsl,我被要求将我在这里提出的问题分开: 我认为两个和三个都适合同一个问题,因为解决一个问题可能有助于解决另一个问题。我正在调试着色器,似乎遇到了问题。首先,当我运行分析模式时,Pix似乎跳过了大量代码。这是一个使用F12捕获并关闭D3DX分析的实验。我必须关闭它,因为我正在使用XNA。有问题的着色器代码如下所示: float4 PixelShaderFunction(float2 OriginalUV : TEXCOORD0) : COLOR0 { // Get the depth
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的和。然而,这些都是在游戏之外运行的,所以结果并不总是有用的。好吧,我认为对于循环线来说,我是在摆弄东西,所以我忘记了将值切换回来。我基本上是在尝试实现这里发现的运动模糊效果:我试图尽可能多地复制这种方法,但我担心编译器是否正在优化它,这种方法是不可能的;它在循环中使用这些数据。在修复循环后,你仍然有问题吗?啊,好吧,你是对的,我现在似乎得到了某种效果,所以可能可以从那里解决它。干杯