Sign in to follow this  
AlanWu

DirectX problem:DrawIndexedPrimitive not working with more than 2 triangle

Recommended Posts

AlanWu    241

So. The situation is that I am using OrthoGraphics and I am trying to call DrawIndexedPrimitive() in order to draw 4 triangles. The 4 triangles are actually 2 rectangles. The 2 rectangles have different coordinate. 

 

Part of codes:

//////////////Vertices

Vertex* vertices;
VB->Lock(0, 0, (void**)&vertices, 0);  //VB is the vertex buffer
int x=-40,y=-40,w=287,h=324;
vertices[0] = Vertex(x-0.5f, -y-h+0.5f, 0.0f,0.0f,1.0f,D3DCOLOR_ARGB(255,255,255,255)); //bL
vertices[1] = Vertex(x-0.5f,-y+0.5f, 0.0f,0.0f,0.0f,D3DCOLOR_ARGB(255,255,255,255));  //tL
vertices[2] = Vertex(x+w-0.5f,-y-h+0.5f, 0.0f,1.0f,1.0f,D3DCOLOR_ARGB(255,255,255,255));  //bR
vertices[3] = Vertex(x+w-0.5f, -y+0.5f, 0.0f,1.0f,0.0f,D3DCOLOR_ARGB(255,255,255,255));   //tR
x=-100,y=0,w=250,h=250;
vertices[4] = Vertex(x-0.5f, -y-h+0.5f, 0.0f,0.0f,1.0f,D3DCOLOR_ARGB(255,255,255,255)); //bL
vertices[5] = Vertex(x-0.5f,-y+0.5f, 0.0f,0.0f,0.0f,D3DCOLOR_ARGB(255,255,255,255));  //tL
vertices[6] = Vertex(x+w-0.5f,-y-h+0.5f, 0.0f,1.0f,1.0f,D3DCOLOR_ARGB(255,255,255,255));  //bR
vertices[7] = Vertex(x+w-0.5f, -y+0.5f, 0.0f,1.0f,0.0f,D3DCOLOR_ARGB(255,255,255,255));   //tR
VB->Unlock();
//////////////Indices
WORD* indices = 0;
IB->Lock(0, 0, (void**)&indices, 0);  //IB is the index buffer
indices[0]  = 0; indices[1]  = 1; indices[2]  = 2;
indices[3]  = 3; indices[4]  = 2; indices[5]  = 0;
indices[6]  = 4; indices[7]  = 5; indices[8]  = 6;
indices[9]  = 7; indices[10]  = 6; indices[11]  = 4;
IB->Unlock();

 

//////////////Render part///////////////

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene();
Device->SetTexture(0,Tex);
Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,8,0,4);
Device->EndScene();
Device->Present(0, 0, 0, 0);

//////////////Render part///////////////

 

 

Result: It only drew the first 6 indices. (I did an experiment to prove this statement. I set the alpha to 128 so if it drew the same object at the same position twice, it will not be transparent. But it is still transparent which means it only drew it once, which means it only drew the first 6 indices.)

 

I can use two calls to achieve it. Like this:

Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,0,2);
Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,4,0,4,0,2);
or this:
Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,0,2);
Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,6,2);
But not this (one call):
Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,8,0,4);
 
Is there any method to do that with one call? I want to make it into a batch.

 

Share this post


Link to post
Share on other sites
Juliean    7077

Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,0,2);

 

D3DPT_TRIANGLESTRIP is wrong. You want D3DTP_TRIANGLELIST. Check google for what a trianglestrip actually is, I'm not really good at describing this kind of thing, but lets just say for generally unconnected triangles (you know, except that the indicies of the neighboring triangles align), you almost alway want a triangle list.

 

Also, you shouldn't specify "4" here, its not the number of vertices from the vertex buffer you set for numVertices, its the number of indices from the index buffer. So it should be "6" or "12" respectively, since you are drawing 6 vertices per quad really and not 4.

Edited by Juliean

Share this post


Link to post
Share on other sites
AlanWu    241

 


Device->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,0,2);

 

D3DPT_TRIANGLESTRIP is wrong. You want D3DTP_TRIANGLELIST. Check google for what a trianglestrip actually is, I'm not really good at describing this kind of thing, but lets just say for generally unconnected triangles (you know, except that the indicies of the neighboring triangles align), you almost alway want a triangle list.

 

Also, you shouldn't specify "4" here, its not the number of vertices from the vertex buffer you set for numVertices, its the number of indices from the index buffer. So it should be "6" or "12" respectively, since you are drawing 6 vertices per quad really and not 4.

 

 

Well. I see where I did wrong. It is because of the D3DPT_TRIANGLESTRIP. I made it a other way round.

For the NumVertices . I don't think you are right. MSDN:

NumVertices [in] UINT

Number of vertices used during this call. The first vertex is located at index: BaseVertexIndex + MinIndex.

Share this post


Link to post
Share on other sites
Juliean    7077


For the NumVertices . I don't think you are right. MSDN:
NumVertices [in] UINT

Number of vertices used during this call. The first vertex is located at index: BaseVertexIndex + MinIndex.

 

Well, since you are using a index buffer, you are really drawing 6 vertices (or 12 respectively), and not 4. Four sort of worked with the trianglestrip since for a strip, 4 indices form a quad, but each index gets expandet to its corresponding vertex, so unless I am very mistaken (I'm just recalling this from the top of my head) it should be the number of indices in a index-buffer driven render process here. Or is it working the way you have it now with trianglelist and 4/8?

Share this post


Link to post
Share on other sites
AlanWu    241

 


For the NumVertices . I don't think you are right. MSDN:
NumVertices [in] UINT

Number of vertices used during this call. The first vertex is located at index: BaseVertexIndex + MinIndex.

 

Well, since you are using a index buffer, you are really drawing 6 vertices (or 12 respectively), and not 4. Four sort of worked with the trianglestrip since for a strip, 4 indices form a quad, but each index gets expandet to its corresponding vertex, so unless I am very mistaken (I'm just recalling this from the top of my head) it should be the number of indices in a index-buffer driven render process here. Or is it working the way you have it now with trianglelist and 4/8?

 

I think I am correct because the writer of Inroduction to 3D GAME Programming with DirectX 9.0 write this code:

Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

It is a cube. It has 8 vertices, 6 surface (12 triangles).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this