DirectX10 : Textures

GameSeed Messages postés 2 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011 - 18 janv. 2011 à 06:33
korsakoff69 Messages postés 9 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 1 février 2016 - 13 févr. 2011 à 17:44
Bonjour à tous.
Je suis actuellement en train de travailler sur mon premier moteur de jeu, pour le moment,
j'essaye simplement de créer un petit jeu 2D.

Je rencontre quelque petites difficultés en ce qui concerne le chargement et l'affichage des textures (pas de shaders, pas de truc très compliqués pour le moment).
J'ai une structure TEXTURE2D me permettant de facilement manipuler les textures :

/*Texture2D.h*/
struct TEXTURE2D {
ID3D10Texture2D* texture;
D3D10_TEXTURE2D_DESC descrition;
};


Une structure c'est cool, mais il nous faut aussi quelques fonctions pour l'utiliser :

/*Dans Direct3D.h*/
void LoadTexture2DFromFile(TEXTURE2D* texture, LPSTR file) {
ID3D10Texture2D* texture2D;
ID3D10Resource* resource;
D3D10_TEXTURE2D_DESC texDesc;
D3DX10CreateTextureFromFile(dev,
file,
NULL,
NULL,
&resource,
NULL);
resource->QueryInterface(__uuidof(ID3D10Texture2D), (LPVOID*)&texture2D);
resource->Release();
texture->texture = texture2D;
texture2D->GetDesc(&texture->descrition);
}

void DrawTexture2D(TEXTURE2D* texture2D, int x, int y, int boxX, int boxY, int boxWidth, int boxHeight) {
D3D10_BOX box;
if ((!boxX) &&(!boxY) && (!boxWidth) && (!boxHeight)) {
box.left = 0;
box.top = 0;
box.right = texture2D->descrition.Width;
box.bottom = texture2D->descrition.Height;
box.back = 1;
box.front = 0;
} else {
box.left = boxX;
box.top = boxY;
box.right = boxX+boxWidth;
box.bottom = boxY+boxHeight;
box.back = 1;
box.front = 0;
}
ID3D10Texture2D* pBackBuffer;
swapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
dev->CopySubresourceRegion(pBackBuffer, 0, x, y, 0, texture2D->texture, 0, &box);
pBackBuffer->Release();
}


Et bien sur les autres fonctions importantes pour initialiser directX (dans le même fichier que le code ci dessus) :

#include "Global.h"

IDXGISwapChain *swapChain;
ID3D10Device *dev;
ID3D10RenderTargetView *backBuffer;
ID3DX10Sprite *d3dSprite;

ID3D10Device* getDev() {
return dev;
}

IDXGISwapChain* getSC() {
return swapChain;
}

void InitD3D(GAMEWINDOW &gw) {
DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
scd.BufferCount = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.Width = gw.width;
scd.BufferDesc.Height = gw.height;
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = gw.hWnd;
scd.SampleDesc.Count = 4;
scd.Windowed = TRUE;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
D3D10CreateDeviceAndSwapChain(NULL,
  D3D10_DRIVER_TYPE_HARDWARE,
  NULL,
  0,
  D3D10_SDK_VERSION,
  &scd,
  &swapChain,
  &dev);
ID3D10Texture2D *pBackBuffer;
swapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
dev->CreateRenderTargetView(pBackBuffer, NULL, &backBuffer);
pBackBuffer->Release();
dev->OMSetRenderTargets(1, &backBuffer, NULL);
D3D10_VIEWPORT viewPort;
ZeroMemory(&viewPort, sizeof(D3D10_VIEWPORT));
viewPort.Width = gw.width;
viewPort.Height = gw.height;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;
dev->RSSetViewports(1, &viewPort);
/*D3DXMATRIX viewProjection;                           ***SPRITE USAGE***
D3DXMatrixOrthoOffCenterLH(&viewProjection,
  (float)viewPort.TopLeftX,
  (float)viewPort.Width,
  (float)viewPort.TopLeftY, 
  (float)viewPort.Height,
  0.1f,
  10.0f);
D3DX10CreateSprite(dev, 1, &d3dSprite);
d3dSprite->SetViewTransform(&viewProjection);*/
}

void CloseD3D() {
swapChain->SetFullscreenState(FALSE, NULL);
swapChain->Release();
dev->Release();
backBuffer->Release();
}

void startRender() {
dev->ClearRenderTargetView(backBuffer, D3DXCOLOR(0.0f, 0.2f, 0.5f, 1.0f));
//d3dSprite->Begin(D3DX10_SPRITE_SORT_TEXTURE);
}

void endRender() {
//d3dSprite->End();
swapChain->Present(0, 0);
}


Les autres variables non déclarées ici se trouvent dans d'autres fichiers inclus dans global.h.
Bref voila le probleme : j'utilise tout ce petit monde de la manière suivante :

#include "Global.h"

void MainLoop() {
TEXTURE2D texture;
LoadTexture2DFromFile(&texture, "sprite-sample.png");
while (HandleMessages()) {
D3D10_BOX box;
startRender();
DrawTexture2D(&texture, 0, 0, 0, 0, 0, 0);
endRender();
}
}


la fenêtre s'ouvre normalement, l'image est rafraichie normalement, seulement, je constate avec stupeur que la fenêtre de présente que la couleur avec laquelle elle est rafraichie... c'est à dire qu'elle est VIDE ! :(



j'ai essayé de placer le dev->CopySubresourceRegion un peut partout dans le code voir si je pouvais déceler l'erreur mais rien ! le programme tourne mais ne me présente aucune texture.
bref, je me demande si ca ne viens pas de l'initialisation car en déboguant le programme je vois bien que le texture2D->descrition est valide ! ou alors je charge mal l'image...
Bref si vous pouvez me guider dans mon probleme je vous serais très reconnaissant !
Si vous avez besoin de plus d'informations, n'hésitez pas a me les demander.
En vous remerciant d'avance...

2 réponses

GameSeed Messages postés 2 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 18 janvier 2011
18 janv. 2011 à 20:30
Quelqu'un à lu mon mon message au moins ? :D
0
korsakoff69 Messages postés 9 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 1 février 2016
13 févr. 2011 à 17:44
bonjour

on n'utilise pas CopySubresourceRegion() pour afficher dans le backbuffer
mais pour copier d'une ressource dans une autre

si tu veux afficher tes textures, créé un ID3DX10Sprite qui te permettra d'afficher tes textures 2D sans shader

/*
void CopySubresourceRegion(
[in] ID3D10Resource *pDstResource,
[in] UINT DstSubresource,
[in] UINT DstX,
[in] UINT DstY,
[in] UINT DstZ,
[in] ID3D10Resource *pSrcResource,
[in] UINT SrcSubresource,
[in] const D3D10_BOX *pSrcBox
);
*/
0
Rejoignez-nous