Jump to content

  • Log In with Google      Sign In   
  • Create Account

DirectX polygons


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
3 replies to this topic

#1 Focusrite   Members   -  Reputation: 100

Like
0Likes
Like

Posted 21 March 2012 - 10:21 AM

Hey Gamedev!

I need to render 2d polygons and thus came up with this solution:

if(FAILED(gd3dDevice->CreateVertexBuffer(sizeof(RectVertex) *32, D3DUSAGE_DYNAMIC, 0, D3DPOOL_DEFAULT, &mVB_Rect, NULL)))
  MessageBox(0, "Error creating RectVertex buffer", 0, 0); //Slightly misleading name, it's a vertexdefiniton containing just position and color

//----------

void Graphics::drawPolygon(cPolygon* shape, D3DCOLOR color, bool filled)
{
	if(shape->requireTriangulation())
		shape->triangulate(); //Triangulates the polygon if not already done - stores in "shape->triangles"

	// Set vertex declaration and stream source
	gd3dDevice->SetVertexDeclaration(RectVertex::Decl);
	gd3dDevice->SetStreamSource(0, mVB_Rect, 0, sizeof(RectVertex));

	// Lock and set the vertices position and texture coordinates
	RectVertex *vertices = 0;
	mVB_texture->Lock(0, 0, (void**)&vertices, 0);

	for(int i = 0; i<shape->getTriangles().size()/3; i++)
	{
		vertices[i*3+0].color = color;
		vertices[i*3+0].pos.x = shape->getTriangles()[i*3+0].x + shape->getPos().x; //Due to triangles beeing in local coordinates
		vertices[i*3+0].pos.y = shape->getTriangles()[i*3+0].y + shape->getPos().y;
		vertices[i*3+0].pos.z = 0.0f;

		vertices[i*3+1].color = color;
		vertices[i*3+1].pos.x = shape->getTriangles()[i*3+1].x + shape->getPos().x;
		vertices[i*3+1].pos.y = shape->getTriangles()[i*3+1].y + shape->getPos().y;
		vertices[i*3+1].pos.z = 0.0f;

		vertices[i*3+2].color = color;
		vertices[i*3+2].pos.x = shape->getTriangles()[i*3+2].x + shape->getPos().x;
		vertices[i*3+2].pos.y = shape->getTriangles()[i*3+2].y + shape->getPos().y;
		vertices[i*3+2].pos.z = 0.0f;
	}
	// Unlock the vertex buffer
	mVB_texture->Unlock();

	if(filled)
		gd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
	else
		gd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
	
	// Draw image
	gd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, shape->getTriangles().size()/3);
}


But it doesn't render at all! If i debug, it's ran, and the shape has the values it is supposed to have.
I do not believe the triangulation is the issue, it was not originally written by me, and on debug it gives *very* plausable results.

The (only slightly modded) triangulation technique here: http://www.flipcode....ngulation.shtml

Anyone have any clue on why it does not work?

Thanks in advance!
- Focusrite
[Not related to the company]

Sponsor:

#2 Evil Steve   Members   -  Reputation: 1983

Like
0Likes
Like

Posted 21 March 2012 - 10:38 AM

Are your transform matrices / shader constants set up correctly?
Do you have anything else rendering?
You could also try running your app through PIX and see if it shows anything relevant.

Steve Macpherson
Systems Programmer

Rockstar North


#3 Focusrite   Members   -  Reputation: 100

Like
0Likes
Like

Posted 21 March 2012 - 12:02 PM

Ah sorry should mention that, yeah other types of rendering works, graphics renders rectangles, textures, lines etc without any issues at all, it's just this one giving me a headache. And no, afraid it's not the shaders as they're as of yet to be added to the project.. hm.

I haven't heard of that PIX, what kind of tool is it? Google seemed not so helpful when searching for it.
[Not related to the company]

#4 Evil Steve   Members   -  Reputation: 1983

Like
1Likes
Like

Posted 22 March 2012 - 03:54 AM

So are you using the fixed function pipeline for rendering?

PIX is a tool that comes with the DirectX SDK that is extremely useful for debugging D3D applications. It's fairly intuitive to just poke around with, but you can also check out the help file that comes with it for more detailed stuff.

Try starting it up, go to File -> New Experiment, put the path to your compiled .exe into it and select "A single-frame capture of Direct3D whenevef F12 is pressed" and click Start Experiment. Then hit F12 when something should be rendering then close your app.
You can then expand the frame in the lower left pane, and look at all the draw calls made. From there, you can see the vertex positions before and after the vertex shader (or fixed-function equivalent) is run, which will hopefully tell you why the vertices aren't visible (E.g. back-facing, offscreen, 0 alpha, etc).

Steve Macpherson
Systems Programmer

Rockstar North





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