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 :
Code C/C++ :
/*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 :
Code C/C++ :
/*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) :
Code C/C++ :
#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 :
Code C/C++ :
#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...
