Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

1

20.05.2005, 12:47

DrawIndexedPrimitive

Hallo :) :) :)


Folgendes: Ich versuch grade ein simples Dreieck darzustellen. Mit VertexBuffer funktionierts schon, aber wenn ichs indiziert zeichnen will seh ich NIX, NULL, GARNICHTS, SCHWARZEN BILDSCHIRM! Ich werde im folgenden versuchen meinen in Objekten gekapselten Code in nicht gekapselten zu "übersetzen". Das entscheidende ist wahrscheinlich DrawIndexedPrimitive. Das Initialisieren von Direct3D u. das Setzen der Matrizen lass ich weg. Es pfunzet schon quiet correctly!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
struct SVertex
{
  float fX,fY,fZ;
  D3DCOLOR D3DColorDiffuse;
};

SVertex aVertex[3]=
{
  {-1.0f,-1.0f,0.0f,0x0000ff},
  {1.0f,-1.0f,0.0f,0x00ff00},
  {0.0f,1.0f,0.0f,0xff0000}
};

//krasser bezeichner, ne? ||

//                        \/

unsigned short int ausiIndex[3]={0,1,2};

PDIRECT3DVERTEXBUFFER9 pVertexBuffer=NULL;
PDIRECT3DINDEXBUFFER9 pIndexBuffer=NULL;

pDirect3D->CreateVertexBuffer(
  16*3,
  D3DUSAGE_WRITEONLY,
  D3DFVF_XYZ|D3DFVF_DIFFUSE,
  D3DPOOL_MANAGED,
  &pVertexBuffer,
  NULL
);
void* p=NULL;
pVertexBuffer->Lock(0,0,&p,0);
sgCopyA((char*& )p,0,(char*& )aVertex,0,3*16);
pVertexBuffer->Unlock();

pDirect3D->CreateIndexBuffer(
  3*2,
  D3DUSAGE_WRITEONLY,
  D3DFMT_INDEX16,
  D3DPOOL_MANAGED,
  &pIndexBuffer
  NULL
);
pIndexBuffer->Lock(0,0,&p,0);
sgCopyA((char*& )p,0,(char*& )ausiIndex,0,3*2);
pIndexBuffer->Unlock();


//Beim Zeichnen:


pDirect3D->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0,1.0f,0);
pDirect3D->BeginScene();
  pDirect3D->SetVertexFormat(D3DFVF_XYZ|D3DFVF_DIFFUSE);
  pDirect3D->SetStreamSource(0,pVertexBuffer,0,16);
  pDirect3D->SetIndices(pIndexBuffer);
  pDirect3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);
  pDirect3D->SetIndices(NULL);
  pDirect3D->SetStreamSource(0,NULL,0,0);
pDirect3D->EndScene();
pDirect3D->Present(NULL,NULL,NULL,NULL);


Ich hoff mir kann jemand sagen warum ich nix seh! Wie gesagt wenn ich den VertexBuffer nicht "indiziert" zeichne seh ich das Dreieck wunderschön.
Quak

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.05.2005, 13:02

Re: DrawIndexedPrimitive

Zitat von »"Samuel G."«

C-/C++-Quelltext

1
unsigned short int ausiIndex[3]={0,1,2};

"short" reicht schon - "short int" ist nicht nötig!

Zitat von »"Samuel G."«

C-/C++-Quelltext

1
2
3
pIndexBuffer->Lock(0,0,&p,0);
sgCopyA((char*& )p,0,(char*& )ausiIndex,0,3*2);
pIndexBuffer->Unlock();

Was ist das für ein komischer Cast?
Ich meine das hier: (char*&)p, wozu das "&"?
Das gleiche beim Vertex-Buffer...

Ansonsten fällt mir nichts auf...
Was sagt denn die Debug-Ausgabe?

Noch ne allgemeine Sache:
Ich würde alle hartgecodeten Zahlen (z.B. die 16 und die 2) rausnehmen und sie durch sizeof(...)-Konstrukte ersetzen (die 16 durch sizeof(SVertex) und die 2 durch sizeof(short)). So können leicht Fehler passieren, wenn Du später mal die Vertexstruktur erweiterst.

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

3

20.05.2005, 13:35

Beitrag

Manche jetzt von dir bemängelte Seltsamkeiten haben ihren Ursprung darin, dass der Code im Original in Klassen gekapselt ist. Um euch tausend Zeilen Code zu ersparen hab ich manches vereinfacht dargestellt. OK, kann sein dass man den cast (char*& ) durch (char* ) ersetzen kann.

Ich glaub ich schreib den Code testhalber neu und kommentier den alten aus, mal sehen was dann passiert.

Danke für die schnelle Answer!


Samuel G.
Quak

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

20.05.2005, 15:23

wenn mich nicht alles täuscht, wärs evtl. angebracht culling auf CW zu stellen oder die reihenfolge der vertices zu verändern ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

20.05.2005, 16:23

Aber er verwendet ja die Reihenfolge 0, 1, 2.
Und er hat geschrieben, dass es ohne Index-Buffer klappt.
Dort wird dieselbe Reihenfolge verwendet.
=> daran kann es nicht liegen...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

20.05.2005, 19:03

Zitat

SVertex aVertex[3]=
{
{-1.0f,-1.0f,0.0f,0x0000ff},
{1.0f,-1.0f,0.0f,0x00ff00},
{0.0f,1.0f,0.0f,0xff0000}
};


ich denk doch...

schaut das nicht so aus!?

Quellcode

1
2
3
4
   2
  / \
 /   \
0-----1


und wenn ich mich nicht ganz täusch is das gegen den uhrzeigersinn...

da er aber vermutlich culling ausgestellt hat, wirds an dem nicht liegen :D

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

7

24.05.2005, 17:46

Beitrag

Danke für die Tips ich habs inzwischen gelöst (Cullmode war auf Gegen und mit Urzeigersinn geschaltet). Der Fehler waren 2 falsche buchstaben, durch die das Kopieren in den Indexbuffer fehlerhaft war (im IndexBuffer stand Schrott).


Samuel G.
Quak

Werbeanzeige