Pentagons in geometry shaders

Started by
8 comments, last by JB3DG 9 years, 12 months ago

Hi guys

Got a bit of a problem here. I am trying to draw a pentagon shape on my geometry shader but for some reason the final vertex is always ending up co-located with the 2nd vertex after the center. Any ideas?


	v.p = center;	
	triStream.Append(v);
	//top left
	v.p = center+float4(-0.07702941f, 0.02502837f, 0, 0);
	triStream.Append(v);
	//top
	v.p = center+float4(0, 0.08099352f, 0, 0);	
	triStream.Append(v);
	//top right
	v.p = center+float4(0.07702941f, 0.02502837f, 0, 0);	
	triStream.Append(v);
	//bottom right
	v.p = center+float4(0.04760679f, -0.06552513f, 0, 0);
	triStream.Append(v);
	//bottom left
	v.p = center+float4(-0.04760679f, -0.06552513f, 0, 0);
	triStream.Append(v);

pentagon_zpsc02ad1ae.png

Advertisement

Just a guess, but it looks like maybe your code is intended to produce a triangle fan, but it's actually outputting a triangle strip (with some of the triangles being back faced culled). .

Hello there thry this out

RestartStrip()

Damn....is there no way to draw it without using RestartStrip?

Well, if one can draw this...

Hehe good one. That just helped me figure out how to dump the center vertex. However...this does lead me to question how more complex shapes (eg 36point circles) would be handled...

Any convex shape should work. Strips alternate between left and right side. For a circle split vertices at one axis (e.g. x < 0).

May give you "bad" triangulation (very acute triangles), if that is a problem.

and for a ring of triangles?

Sure:

    int n = 20;
    float r1 = 0.1;
    float r2 = 0.05;
    for(int i = 0; i <= n; i++)
    {
        float a = (float)i / n * 2 * 3.1415926;
        float x, y;
        sincos(a, x, y);
        v.Position = mul(center + r2 * float4(x,y,0,0), WVP);
        triStream.Append(v);
        v.Position = mul(center + r1 * float4(x,y,0,0), WVP); 
        triStream.Append(v);
    }

excellent. Thanks a bunch!

This topic is closed to new replies.

Advertisement