Question

J'ai une application simple dans laquelle je dois laisser l'utilisateur sélectionner un shader (fichier HLSL .fx ou assembleur, éventuellement avec plusieurs passes, mais uniquement un pixel shader) et le prévisualiser.

L’application s’exécute, la liste des shaders s’affiche et un bouton ouvre la fenêtre de prévisualisation & ". &"; A partir de cette fenêtre d'aperçu (qui contient une fenêtre de visualisation DirectX), l'utilisateur sélectionne une image et le shader est exécuté sur cette image et affiché. Un seul cadre doit être restitué (pas en temps réel).

J'ai une combinaison de vertex / pixel shader configurée qui prend un quad et le restitue à l'écran, texturée avec l'image choisie. Cela fonctionne parfaitement. Je dois ensuite exécuter un autre effet, purement pixel shader, sur la sortie du premier effet et afficher l'image finale (post-traitée) sur l'écran. Cela ne fonctionne pas du tout.

J'ai essayé ces derniers jours de le faire fonctionner, mais sans raison apparente, les blocs de code identiques utilisés pour rendre chaque effet rendent uniquement le premier. Je peux ajouter le deuxième fichier de shader en tant que deuxième passe dans le premier fichier de shader et il fonctionne parfaitement (même s'il va à l'encontre de mon objectif de prévisualisation des shaders créés par l'utilisateur). Lorsque j'essaie d'utiliser un deuxième effet (qui charge et compile parfaitement), il ne fait rien. J'ai pris les résultats du premier shader (avec GetRenderTargetData) et les ai placés dans une texture & Amp; surface (destTex et destSur), puis définissez cette texture comme entrée pour la deuxième passe (avec dev - > SetTexture et effet ultérieur - > SetTexture (" thisframe &.; , destTex)).

Tous les appels aboutissent, les effets sont compilés, les textures se chargent, des quadruples sont dessinés, mais l’effet n’est pas visible. Je soupçonnais au début que le périphérique (créé avec le traitement de vertex par logiciel) était à l'origine du problème, mais cela ne semble pas être le cas (j'ai essayé avec du matériel et mélangé). De plus, en utilisant à la fois un appareil HAL et un appareil REF (ce n'est pas un problème, puisque l'application n'est de toute façon pas en temps réel), ce second shader n'est pas visible. Tout est écrit en C ++ pour Direct3D 9.

Était-ce utile?

La solution

Essayez d'effacer le tampon de profondeur-gabarit après chaque rendu du quad.

Autres conseils

Créez d'abord une texture, puis rendez le premier shader directement dans cette texture. Rendez enfin le second shader avec la texture comme entrée dans le Backbuffer.

Il doit exister une sorte de saisie de sommet et de traitement de sommet (fonction fixe ou shader) pour que le pixel shader soit exécuté. Fournissez-vous le vertex shader, et si tel est le cas, êtes-vous sûr que le pixel shader l’attend? À quoi ressemble votre appel de tirage?

Il est probablement intéressant d'examiner une trace PIX de votre application pour connaître l'état de l'appareil lorsque vous essayez d'utiliser l'effet utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top