2010-11-13 26 views
2

J'ai une question simple à poser ... C'est l'une des premières choses que vous apprenez sur les shaders lorsque vous les utilisez avec XNA, vous pouvez passer des variables de C# au code shader via la fonction Effect.Parameters. Par exemple:Est-il possible de * récupérer * des données entières à partir du code shader?

Effect.Parameters["shaderVariable"].SetValue(someValue);

Dans la ligne ci-dessus, vous envoyez la valeur stockée dans « someValue » à la variable de shaders « shaderVariable » ..

Peut-on faire l'inverse aussi bien? Comme par exemple, vous voulez déboguer les rouages ​​internes d'un code de shader et renvoyer des données numériques à votre application C#, alors existe-t-il une relation similaire mais opposée fonctionnelle?

Répondre

4

Pas vraiment. Le problème est qu'un pixel shader est exécuté une fois par pixel et un vertex shader une fois par sommet. Donc, vous avez potentiellement des centaines d'exemples de votre programme à choisir, quand vous dessinez, alors comment savez-vous lequel vous voulez obtenir la valeur de sortie?

La seule façon d'obtenir une sortie d'un shader est via l'image qu'il sort (GPGPU). Mais si tout ce que vous voulez faire est le débogage des shaders, utilisez PIX dans le SDK DirectX.

0

Le pipeline graphique ira toujours plus loin, CPU -> Vertex -> Pixel -> Frame. Si vous avez une valeur dans votre pixel shader que vous voulez examiner, il suffit de modifier votre shader légèrement pour qu'il renvoie cette valeur en tant que couleur. Par exemple, vous pouvez renvoyer les valeurs xy d'un texCoord comme les canaux de couleur rouge et vert dans votre image.

0

Oui, vous pouvez obtenir des données à partir du shader (au moins dans XNA 4.0), par exemple:

var projection = <your effect>.Parameters["projection"].GetValueMatrix();