2013-02-08 3 views
4

on m'a demandé de partager des questions que je pose ici:Pix, quelques problèmes Je ne comprends pas

HLSL and Pix number of questions

Je pensais que deux et trois fois serait apte à la même question comme solution de l'un peut aider à résoudre l'autre. J'essaye de déboguer un shader et semble rencontrer des problèmes. Tout d'abord, Pix semble sauter une grande quantité de code lorsque je cours en mode analyse. Ceci analyse une expérience avec des captures F12 et avec l'analyse D3DX désactivée. Je dois l'éteindre pendant que j'utilise XNA. Le code de shaders en question est ci-dessous:

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; 
} 

Avec une image capturée et lors du débogage d'un pixel je ne peux voir deux lignes de travail. Ce sont color = tex2D (sceneSampler, OriginalUV) et finalColor = color/xNumSamples. Le reste Pix saute ou ne fait pas.

Puis-je déboguer en temps réel avec Pix? Je me demande si cette méthode révélerait plus d'informations.

Cheers,

Répondre

1

Il semblerait que la plupart de ce code shader est en cours d'optimisation out (pas compilé parce qu'il est hors de propos). En fin de compte, tout ce qui compte dans la valeur de retour finalColor est défini avec color et xNumSamples.

// Average all of the samples to get the final blur color. 
finalColor = color/xNumSamples; 

Je ne sais pas où xNumSamples se prépare, mais vous pouvez voir que la seule ligne qui compte pour color est color = tex2D(sceneSampler, OriginalUV); (donc il ne pas être supprimé).

Chaque ligne avant cela n'est pas pertinente car elle sera écrasée par cette ligne.

Le seul bit qui suit est que pour la boucle:

for(int i = 1; i < 1; ++i, OriginalUV += velocity) 

Mais cela n'exécuter parce que i < 1 est faux du get-go (i est attribué une valeur de départ de 1).

Espérons que ça aide!


Pour vous répondre à la deuxième question, je crois débogage des shaders en temps réel, vous devez utiliser quelque chose comme Nvidia FX Composer et Shader Debugger. Cependant, ceux-ci s'exécutent en dehors de votre jeu, donc les résultats ne sont pas toujours utiles.

+0

Ok, je pense que pour la ligne de boucle, c'était moi qui tripotais les choses, alors c'est moi qui oublie de changer les valeurs. J'essaie fondamentalement d'atteindre l'effet de flou de mouvement trouvé ici: http://http.developer.nvidia.com/GPUGems3/gpugems3_ch27.html J'ai essayé de copier cette méthodologie autant que possible mais je m'inquiète si le Le compilateur optimise le fait que cette méthodologie est impossible. – Bushes

+0

Après la fixation de la boucle, il ne doit pas supprimer les lignes ci-dessus; il utilise ces données dans la boucle. Avez-vous encore des problèmes après avoir réparé la boucle? – Goose

+0

Ahh, ok vous avez raison, je semble obtenir un effet maintenant, donc je peux probablement travailler à partir de là. À votre santé – Bushes