J'ai une application qui affiche l'objet 3D en utilisant D3D11 et DirectXMath. Je veux aussi afficher un HUD dans le coin en haut à gauche, donc j'ai pensé que j'utiliserais DirectXTK sprintBatch/spriteFont pour le faire. Ma 3D va bien jusqu'à ce que j'ajoute le code suivant. Est-ce que DirectXTK utilise ses propres shaders et change certains états?DirectXTK et 3D Ojbect
Comment résoudre ce problème?
m_spriteBatch->Begin();
const wchar_t* output = L"Hello World";
m_font->DrawString(m_spriteBatch.get(), output, DirectX::XMFLOAT2{ 10, 10 }, Colors::Yellow);
m_spriteBatch->End();
Without spritefont->DrawString
Voici est-sont mes shaders.
Texture2D txDiffuse : register(t0);
SamplerState samLinear : register(s0);
cbuffer WorldViewProjectionType : register(b0)
{
matrix World;
matrix View;
matrix Projection;
};
cbuffer TransparentBuffer
{
float4 blendAmount;
};
struct VS_INPUT
{
float4 Pos : POSITION;
float2 Tex : TEXCOORD0;
};
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float2 Tex : TEXCOORD0;
};
PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output = (PS_INPUT)0;
output.Pos.w = 1.0f;
output.Pos = mul(input.Pos, World);
output.Pos = mul(output.Pos, View);
output.Pos = mul(output.Pos, Projection);
output.Tex = input.Tex;
return output;
}
float4 PS(PS_INPUT input) : SV_Target
{
float4 color = txDiffuse.Sample(samLinear, input.Tex);
color.a = blendAmount.a;
return color;
}
float4 PSGray(PS_INPUT input) : SV_Target
{
float4 color = txDiffuse.Sample(samLinear, input.Tex);
float fLuminance = 0.299f * color.r + 0.587f * color.g + 0.114f * color.b;
return float4(fLuminance, fLuminance, fLuminance, blendAmount.a);
}
Oui, cela change les états, y compris les shaders. Vous pouvez le réparer en restaurant tous les états requis pour le rendu de vos objets juste avant l'appel. – Drop
Ceci est un coup dans le noir. Le spriteBatch-> Begin() prend un tas d'états. devrais-je mettre mes états dans cela et spritebatch les restaurer après avoir dessiné la chaîne? –
Eh bien, c'est comme cela que le rendu est habituellement fait. L'API DirectX est une [machine à états] (https://en.wikipedia.org/wiki/Finite-state_machine). En boucle de rendu à chaque itération, vous appliquez l'ensemble d'états 1, dessinez l'objet 1, appliquez l'ensemble d'états 2, dessinez l'objet 2, ..., appliquez l'ensemble d'états n, dessinez l'objet n. DirectXTK n'est pas de la magie, il enveloppe juste l'une de ces paires pour vous. Il existe une méthode [ID3D11DeviceContext :: ClearState] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff476389%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396) cela pourrait être utile parfois. Vérifiez l'un des livres de démarrage Computer Graphics pour plus de détails. – Drop