PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DirectX9 DrawIndexedPrimitive Problem


andi0310
2009-03-23, 12:43:45
Hallo alle zusammen.
Ich habe folgendes Problem.

class _3DOTDLLExpImp _3DOTVec3D
{

public:
float x,y,z;

_3DOTVec3D();
~_3DOTVec3D();

_3DOTVec3D(float Xv,float Yv,float Zv);
};

class _3DOTDLLExpImp _3DOTVec2D
{
public:
float x,y;

_3DOTVec2D();
~_3DOTVec2D();

_3DOTVec2D(float,float);
};

struct _3DOT_Vertex
{
_3DOTVec3D Vector;
D3DCOLOR color;
_3DOTVec2D uvTextur;
};

PDIRECT3DVERTEXBUFFER9 Vbuffer;
IDirect3DIndexBuffer9 *Ibuffer;
PDIRECT3DTEXTURE9 Textur;
WORD IQuadrat[6]={0,1,2, 2,3,0}; // Indexe

void SzeneIni()
{
if(D3DXCreateTextureFromFileEx(_3DOT_Element->plD3DDev9,"Kaffeetasse.BMP",
256,
256,
10,
0,
D3DFMT_UNKNOWN,
D3DPOOL_DEFAULT,
D3DX_FILTER_TRIANGLE,
D3DX_DEFAULT,
0,
NULL,
NULL,
&Textur)==D3D_OK)
_3DOTLgWr("Texttur erfolgreich geladen !",0);
else
_3DOTLgWr("Textur konnte nicht geladen werden !",1);

// Vertexe für den Würfel werden erstellt.
VQuadrat[0].Vector.x=-1.0f; // Top
VQuadrat[0].Vector.y=1.0f;
VQuadrat[0].Vector.z=-1.0f;

VQuadrat[1].Vector.x=-1.0f;
VQuadrat[1].Vector.y=1.0f;
VQuadrat[1].Vector.z=1.0f;

VQuadrat[2].Vector.x=1.0f;
VQuadrat[2].Vector.y=1.0f;
VQuadrat[2].Vector.z=1.0f;

VQuadrat[3].Vector.x=1.0f;
VQuadrat[3].Vector.y=1.0f;
VQuadrat[3].Vector.z=-1.0f;

for(z=0;z<4;z++)
VQuadrat[z].color=D3DCOLOR_XRGB(250,250,250);

VQuadrat[0].uvTextur.x=0.0f;
VQuadrat[0].uvTextur.y=0.0f;

VQuadrat[1].uvTextur.x=0.0f;
VQuadrat[1].uvTextur.y=0.0f;

VQuadrat[2].uvTextur.x=0.0f;
VQuadrat[2].uvTextur.y=0.0f;

VQuadrat[3].uvTextur.x=0.0f;
VQuadrat[3].uvTextur.y=0.0f;


if(_3DOT_Element->plD3DDev9->CreateVertexBuffer(sizeof(_3DOT_Vertex)*4,0,D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX 1,D3DPOOL_MANAGED,&Vbuffer,NULL)==D3D_OK)
_3DOTLgWr("VertexBuffer wurde erstellt !",0);
else
_3DOTLgWr("Es konnte kein VertexBuffer erstellt werden !",0);

if(_3DOT_Element->plD3DDev9->CreateIndexBuffer(6*2, 0,D3DDFMT_INDEX16,D3DPOOL_MANAGED,&Ibuffer,NULL)==D3D_OK)
_3DOTLgWr("IndexBuffer wurde erfolgreich erstellt !",0);
else
_3DOTLgWr("IndexBuffer konnte nicht erstellt werden !",0);

if(_3DOT_Element->plD3DDev9->SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)ProMatr)==D3D_OK)
_3DOTLgWr("ProjrctionsMatrix wurde gesetzt !",1);
else
_3DOTLgWr("ProjectionsMatrix konnte nicht gesetzt werden !",1);
}

void Render()
{
_3DOT_Element->plD3DDev9->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(100,100,200),1.0f,0);
_3DOT_Vertex *VertexBufferZ;
WORD *IndexBufferZ; // Bei D3DFMT_INDEX32 hier DWORD benutzen.

Vbuffer->Lock(0,sizeof(_3DOT_Vertex)*4,(void**)(&VertexBufferZ),D3DLOCK_NOSYSLOCK);

Ibuffer->Lock(0,6*2,(void**)(&IndexBufferZ),D3DLOCK_NOSYSLOCK);

for(z=0;z<4;z++)
{
VertexBufferZ[z].Vector.x=VQuadrat[z].Vector.x;
VertexBufferZ[z].Vector.y=VQuadrat[z].Vector.y;
VertexBufferZ[z].Vector.z=VQuadrat[z].Vector.z;
VertexBufferZ[z].color=VQuadrat[z].color;
VertexBufferZ[z].uvTextur.x=VQuadrat[z].uvTextur.x;
VertexBufferZ[z].uvTextur.y=VQuadrat[z].uvTextur.y;
}

for(z=0;z<6;z++)
IndexBufferZ[z]=(IQuadrat[z]);

Vbuffer->Unlock();
Ibuffer->Unlock();

if(_3DOT_Element->plD3DDev9->SetTexture(0,Textur)!=D3D_OK) _3DOTLgWr("Textur konnte nicht gesetzt werden !",0);

if(_3DOT_Element->plD3DDev9->SetStreamSource(0,Vbuffer,0,sizeof(_3DOT_Vertex))!=D3D_OK)
_3DOTLgWr("Kein Vertex Datenfluss gesetzt !",0);

if(_3DOT_Element->plD3DDev9->SetIndices(Ibuffer)!=D3D_OK)
_3DOTLgWr("Keine Indexe gesetzt !",0);

_3DOT_Element->plD3DDev9->BeginScene();

if(_3DOT_Element->plD3DDev9->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0,
0,
4,
0,2)!=D3D_OK)
_3DOTLgWr("Zeichenvorgang fehlgeschlagen !",0);

_3DOT_Element->plD3DDev9->SetTexture(0,NULL);
_3DOT_Element->plD3DDev9->SetStreamSource(0,NULL,0,0);
_3DOT_Element->plD3DDev9->SetIndices(NULL);

_3DOT_Element->plD3DDev9->EndScene();

_3DOT_Element->plD3DDev9->Present(NULL,NULL,NULL,NULL);

Nach Ausführen des Programms( hier angegebener Quelltext ist nicht vollständig) der Bildschirm wie in Clear(...) angegeben Hellblau gefärbt. Aber es findet kein Zeichen vorgang statt.
Stattdessen, habe ich in meinem Logbuchfile die Meldung "Zeichenvorgang fehlgeschlagen !" . Die RenderFunktion wird im WindowProc durchgeführt.

Kann mir irgendjemand sagen, was ich falsch mache ?
Vielen Dank !

andi0310
2009-03-23, 12:47:47
Ich muss etwas Korigieren.
Texturkoordinaten
VQuadrat[0].uvTextur.x=0.0f;
VQuadrat[0].uvTextur.y=0.0f;

VQuadrat[1].uvTextur.x=0.0f;
VQuadrat[1].uvTextur.y=1.0f;

VQuadrat[2].uvTextur.x=1.0f;
VQuadrat[2].uvTextur.y=1.0f;

VQuadrat[3].uvTextur.x=1.0f;
VQuadrat[3].uvTextur.y=0.0f;