我被要求分开我在这里提出的问题:
HLSL and Pix number of questions
我认为两个和三个都适合同一个问题,因为一个解决方案可能有助于解决另一个问题。我正在尝试调试着色器,似乎遇到了问题。首先,当我运行分析模式时,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;
}
使用捕获的帧并在调试像素时,我只能看到两条线路正常工作。这些是color = tex2D(sceneSampler,OriginalUV)和finalColor = color / xNumSamples。其余的Pix只是跳过或不做。
我也可以使用Pix实时调试吗?我想知道这种方法是否能揭示更多信息。
干杯,
答案 0 :(得分:1)
看起来大多数着色器代码都被优化了(没有编译因为它是无关紧要的)。
最后,使用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)
但是这永远不会执行,因为i < 1
从一开始就是假的(我被赋予了一个起始值1)。
希望有所帮助!
要回答第二个问题,我相信要实时调试着色器,您需要使用Nvidia的FX Composer和Shader Debugger之类的东西。但是,那些在你的游戏之外运行,所以结果并不总是有用。