2017-07-05 7 views
0

J'ai un problème étrange lors de l'utilisation de deux RenderTargets dans SharpDX, en utilisant DX11. Je rends un ensemble d'objets pouvant être superposés et j'utilise des modes de fusion pour obtenir une transparence partielle. Le rendu est effectué sur deux cibles de rendu en une seule passe, la seconde cible de rendu étant utilisée comme sélecteur de couleur - je rends simplement l'ID de l'objet (entier) à cette seconde cible et récupère l'ID de la texture après le rendu .Aucune sortie dans le second RenderTarget lorsque l'état de fusion est défini

Le problème que j'obtiens est frustrant, car cela ne se produit pas sur tous les ordinateurs. En fait, cela ne se produit sur aucune de nos machines de développement, mais a été rapporté dans la nature - typiquement sur des machines avec des graphiques Intel (HD) intégrés. Sur ces ordinateurs, aucune sortie n'est générée dans la deuxième cible de rendu. Nous avons été en mesure de reproduire le problème sur un ordinateur portable ici, et si nous ne pas définir l'état de fusion, alors le problème est résolu. Évidemment, ce n'est pas une solution, car nous avons besoin de l'assemblage.

Les descriptions de texture pour la principale cible de rendu (0) et la couleur cueillette regard cible comme ceci:

var desc = new Texture2DDescription 
     { 
      BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, 
      Format = Format.B8G8R8A8_UNorm, 
      Width = width, 
      Height = height, 
      MipLevels = 1, 
      SampleDescription = sampleDesc, 
      Usage = ResourceUsage.Default, 
      OptionFlags = RenderTargetOptionFlags, 
      CpuAccessFlags = CpuAccessFlags.None, 
      ArraySize = 1 
     }; 

var colourPickerDesc = new Texture2DDescription 
      { 
       BindFlags = BindFlags.RenderTarget, 
       Format = Format.R32_SInt, 
       Width = width, 
       Height = height, 
       MipLevels = 1, 
       SampleDescription = new SampleDescription(1, 0), 
       Usage = ResourceUsage.Default, 
       OptionFlags = ResourceOptionFlags.None, 
       CpuAccessFlags = CpuAccessFlags.None, 
       ArraySize = 1, 
      }; 

L'état de mélange est défini comme ceci:

var blendStateDescription = new BlendStateDescription { AlphaToCoverageEnable = false }; 


     blendStateDescription.RenderTarget[0].IsBlendEnabled = true; 
     blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All; 

     _blendState = new BlendState(_device, blendStateDescription); 

et est appliquée à le début du rendu. J'ai essayé de définir explicitement IsBlendEnabled sur false pour RenderTarget [1] mais cela ne fait aucune différence.

Toute aide à ce sujet serait la bienvenue - en fin de compte, nous pourrions avoir à recourir à faire deux passes de rendu, mais ce serait ennuyeux.

+0

Peut-être que cela a quelque chose à voir avec l'indicateur 'IndependentBlendEnable' dans' BlendStateDescription'. L'état de mélange RenderTarget [1] '(et le reste) ne sera utilisé que s'il est défini sur true. – VTT

+0

Merci pour l'astuce - j'ai * vraiment * pensé que ça allait être la solution, mais malheureusement pas - cela ne fait aucune différence (toujours pas de sortie), bien qu'en droit cela n'aurait pas marché sans que ça soit réglé. La chose étrange est que cela fonctionne bien sur la plupart des cartes graphiques, mais pas sur certains - alors sans aucun doute je fais quelque chose de mal, mais s'en tirer en quelque sorte. – Matt

Répondre

0

J'ai maintenant résolu ce problème, même si exactement comment ou pourquoi le "correctif" ne fonctionne pas tout à fait clair. Chapeau à VTT pour m'avoir indiqué le drapeau IndependentBlendEnable dans le BlendStateDescription. Définir ce drapeau sur son propre (à vrai), avec RenderTarget[1].IsBlendEnabled = false, n'était pas suffisant. Ce qui a fonctionné à la fin était de remplir un ensemble complet de valeurs pour RenderTarget[1], avec les drapeaux mentionnés ci-dessus. Vraisemblablement, toutes les autres valeurs du second RenderTarget seraient ignorées, car blend est désactivé, mais pour une raison quelconque, elles doivent être remplies. Comme mentionné précédemment, ce problème n'apparaît que sur certaines cartes graphiques, donc je n'ai aucune idée si c'est le bon comportement ou juste une bizarrerie de ces cartes.

+0

Quel niveau de fonctionnalité matérielle Direct3D sont les cartes 'défectueuses'? –

+0

Nous vérifions 10.1, car c'est le minimum dont nous avons besoin. La seule machine locale qui a échoué (ou qui était utilisée avant le "correctif") est un HD4000 avec support matériel DX11 (DDI 11.2 dans dxdiag). – Matt