2010-02-23 3 views
0

J'ai commencé au début, et mon code affichera le total général de certains textes. J'ai ajouté le support pour les sprites. Le problème que j'ai rencontré, c'est qu'il ne semble pas reconnaître mon HLSL. J'ai mis la technique, je l'ai commencé, j'ai commencé la passe, j'ai dessiné les sprites, je les ai roués, j'ai terminé la passe, la technique. Et D3D arrive avec ce petit "Using FF to PS Converter" dans la sortie VS. Pareil pour VS. Je n'essaie pas de faire quelque chose d'avancé avec mon HLSL - il suffit de l'utiliser et de se familiariser un peu avec cela et de m'assurer de savoir comment l'implémenter. C'est C++ 0x automatique, d'ailleurs, donc la déduction de type automatique (parce que je suis paresseux).HLSL et ID3DXFont/ID3DXSprite

#define D3DCALL(a) { auto __ = a; if (FAILED(__)) DXTrace(__FILE__, __LINE__, __, WIDEN(#a), TRUE); } 

D3DCALL(spriteeffect->SetTechnique(spritetechnique)); 
D3DCALL(spriteeffect->Begin(&passes, NULL)); 
D3DCALL(spriteeffect->BeginPass(0)); // We know this is zero. 
D3DCALL(sprite->Begin(D3DXSPRITE_OBJECTSPACE | D3DXSPRITE_DO_NOT_ADDREF_TEXTURE | D3DXSPRITE_SORT_TEXTURE | D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_DEPTH_FRONTTOBACK)); 
RenderAndCleanUp(common->sprites); 
D3DCALL(sprite->End()); 
D3DCALL(spriteeffect->EndPass()); 
D3DCALL(spriteeffect->End()); 

où RenderAndCleanUp est une fonction simple basé sur un modèle qui boucle à travers les sprites, détruit ceux qui ont besoin d'être, et rend le reste, et Common-> sprites est un simple vecteur de tous les objets de sprite. Puisque DXTrace ne s'éteint jamais, je vais garantir qu'aucune des fonctions échouera. J'ai également placé le panneau de contrôle au débogage maximum.

J'ai vérifié les D3DXHANDLE et ils sont tous non-NULL. Il ne signale aucune erreur de compilation, aucune erreur ou avertissement.

// Contains the HLSL for sprites. 

// Based on transform.fx, by Frank Luna. 

// FX parameter (global variable to the shader). 
uniform extern float4x4 gWVP; 

// Structure 
struct OutputVS 
{ 
     float4 posH : POSITION0; 
float4 color : COLOR0; 
}; 

// Vertex shader 
OutputVS SpriteVS(float3 post : POSITION0, 
    float4 col : COLOR0) 
{ 
    // Zero out our output. 
    OutputVS outVS = (OutputVS)0; 

    outVS.posH = mul(float4(post, 1.0f), gWVP); // Transform 
    outVS.color = col; 

    // Done--return the output. 
    return outVS; 
} 

// Pixel shader - take the original colour of the pixel and just return it. Nothing fancy. 
float4 SpritePS(float4 col : COLOR0) : COLOR 
{ 
    return col; 
} 

technique Sprite 
{ 
    pass P0 
    { 
     // Specify the vertex and pixel shader associated 
     // with this pass. 
     vertexShader = compile vs_3_0 SpriteVS(); 
     pixelShader = compile ps_3_0 SpritePS(); 
    } 
} 

Ceci est du C++ natif en regardant Direct3D9.

+0

"parce que je suis paresseux" Parce que vous faites bien les choses. : P – GManNickG

+0

Vous ne semblez pas dire exactement comment cela ne fonctionne pas comme prévu, sauf si je l'ai manqué ... – jcoder

+0

Parce qu'ils ne sont pas en train de charger ou d'appeler le HLSL en aucune façon. Ils utilisent juste FF. Par exemple, j'ai modifié le pixel shader pour toujours revenir en bleu, mais il n'y avait aucun effet. – DeadMG

Répondre

0

AFAIR Le rendu D3DXSprite et D3DXFont est implémenté dans le D3DX lui-même. Ainsi, il définit ses propres shaders, états (émule le pipeline à fonction fixe) et restitue le texte/les sprites. Ainsi, vos shaders et états n'ont aucun effet sur ces objets. Vous pouvez implémenter votre propre sous-système de rendu de texte/sprite, ce n'est pas si difficile. Un autre vote pour cela est que Microsoft a officiellement désapprouvé D3DX.

Questions connexes