• Advertisement
Sign in to follow this  

Pentagons in geometry shaders

This topic is 1368 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
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). .

Share this post


Link to post
Share on other sites

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

Edited by Naruto-kun

Share this post


Link to post
Share on other sites

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. 

Share this post


Link to post
Share on other sites
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);
    }

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement