Jump to content

  • Log In with Google      Sign In   
  • Create Account


DirectX problem:DrawIndexedPrimitive not working with more than 2 triangle


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 AlanWu   Members   -  Reputation: 191

Like
0Likes
Like

Posted 31 December 2013 - 04:15 AM

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.

 



Sponsor:

#2 Juliean   GDNet+   -  Reputation: 2387

Like
0Likes
Like

Posted 31 December 2013 - 04:57 AM


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, 31 December 2013 - 05:04 AM.


#3 AlanWu   Members   -  Reputation: 191

Like
0Likes
Like

Posted 31 December 2013 - 06:17 PM

 


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.



#4 Juliean   GDNet+   -  Reputation: 2387

Like
0Likes
Like

Posted 01 January 2014 - 05:44 AM


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?



#5 AlanWu   Members   -  Reputation: 191

Like
0Likes
Like

Posted 02 January 2014 - 08:16 PM

 


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).






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS