2009-11-09 9 views
0

Ceci est toujours un problème en suspens. J'essaye d'obtenir un point de travail de système de Sprites de point de rendre un soleil dans mon monde. J'ai remarqué qu'un autre utilisateur posait une question similaire (avec le même code, vraisemblablement de ma classe :)) mais ils n'ont pas pu le compléter. Mon code actuel pour cela est la suivante:Utilisation de sprites ponctuels avec direct x. Quelles sont les étapes à suivre?

float fPointSize = 10.0f,fPointScaleB = 100.0f; 

IDirect3DDevice9 * m_Device = LudoRenderer :: getInstance() -> GetDevice(); m_Device-> SetRenderState (D3DRS_POINTSPRITEENABLE, true); m_Device-> SetRenderState (D3DRS_POINTSCALEENABLE, true);

m_Device->SetRenderState(D3DRS_POINTSIZE, 
            *((DWORD*)&fPointSize)); 
    m_Device->SetRenderState(D3DRS_POINTSCALE_B, 
            *((DWORD*)&fPointScaleB)); 

    m_Device->SetRenderState(D3DRS_ALPHABLENDENABLE,true); 
    m_Device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE); 
    m_Device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); 


    std::wstring hardcoded = L"..\\Data\\sun.png"; 
m_SunTexture = LudoTextureManager::GetInstance()->GetTextureData(hardcoded.c_str()).m_Texture; 

    m_Device->SetTexture(0,m_SunTexture); 
    m_Device->DrawPrimitive(D3DPT_POINTLIST,0,12); 

Je ne vois pas mon soleil sur l'écran, et il semble être de faire le mélange alpha sur le reste de mon monde, plutôt que sur un soleil que je suis en train de charger. Cela pourrait-il être dû à quels appareils j'utilise? Toute aide serait grandement appréciée :)

+0

Aack! Veuillez sauvegarder LudoRenderer :: GetInstance() -> GetDevice() quelque part avant que mes yeux ne saignent ... – Justicle

+0

Compréhensible: P – Mark

+0

Avez-vous exécuté PIX pour voir ce qui se passe quand vous appelez DrawPrimitive? – Anteru

Répondre

2

Vous ne semblez pas avoir d'appel de tirage. Avez-vous manqué de poster du code, ou est-ce peut-être votre problème?

S'il vous manque l'appel draw, je suggère que l'appel DrawPrimitiveUP() est probablement celui que vous voulez. Vous devrez également définir le format de flux pour correspondre à votre structure vetex (setFVF()). Quelque chose le long de ces lignes:

#define D3DFVF_SUNVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) 

struct SUNVERTEX 
{ 
    float x,y,z; 
    DWORD colour; 
}; 

D3DVECTOR pos = { 0.f, 0.f, 0.f }; // Set this to the position you want 
SUNVERTEX sunVert = { pos.x, pos.y, pos.z, D3DCOLOR_RGBA(255, 255, 0, 255) }; 

IDirect3DDevice9& device = LudoRenderer::GetInstance()->GetDevice(); 
device->SetFVF(D3DFVF_SUNVERTEX); 
device->DrawPrimitiveUP(D3DPT_POINTLIST, 1, sunVert, sizeof(SUNVERTEX)); 

Si vous avez le temps, je vous recommande fortement de lire le « Guide de programmation » de la documentation DirectX SDK (vous devez avoir installé). Ce n'est pas vraiment un tutoriel, mais il couvre les bases de l'architecture DirectX.

+0

Cela pourrait être mon problème! Ce n'est pas tout ce bien documenté .. La seule ressource que j'ai pu trouver était http://www.two-kings.de/tutorials/dxgraphics/dxgraphics17.html – Mark

+0

J'ai ajouté l'appel de dessin du tutoriel lié à. toujours pas de dés. – Mark

+0

Oui, mais vous n'avez pas défini la source de flux (ou utilisé la variante DrawPrimitiveUP) ou le format de vertex. –