Jump to content
  • Advertisement
Sign in to follow this  
blueshogun96

OpenGL Drawing 2D Volumetric Lines (Without Geometry Shaders)

This topic is 1016 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

My game was originally written using OpenGL [ES], and thanks to libANGLE, I was able to port my game to Direct3D11 almost effortlessly.  Now I have run into a small problem, there is no equivalent in D3D11 to glLineWidth (not even ANGLE supports this; plus the devs explicitly stated it will not be supported).  So atm, the best I can do would be to draw a volume line using a triangle strip.  The problem is, I'm having trouble wrapping my head around the math required to do it.  As stated above, I'm intentionally not using geometry shaders.  This is because my game has to support 9_3 for Windows Phone and Surface models that don't support anything higher.  And yes, I have been googling this for quite some time now, still haven't quite found what I'm looking for.  Any ideas?  Thanks.

 

Shogun.

Share this post


Link to post
Share on other sites
Advertisement

one simple solution can be to simply draw several 1pixel lines. if your goal is 2d rendering, then you can exactly specify the start and ending pixel (which is like 2d line drawing by itself with orthogonal direction to your current line).

 

 

if your line is defined by x0|y0 - x1|y1, the direction is (x1-x0)|(y1-y0), the orthogonal direction is -(y1-y0)|(x1-x0)

you walk in that direction with a line algorithm e.g.

https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

for the start and for the end point and draw a line.

Share this post


Link to post
Share on other sites

curver_curve_structure.png

Yay for posting pics. I wrote a small blog post quickly about curves in Curver, a program I'm working on currently. Unfortunately at the time I didn't have enough time to describe it in great detail, but maybe it will provide some insight. Click

Share this post


Link to post
Share on other sites
Here is some old code I wrote using OpenGL. It is ugly, but it works and is fast.
 
class vertex{
public:
float x,y;
};

void DrawWideLine(vertex p1, vertex p2, float width,int end_cap,int num_segments)
{
	float	dx, dy;
	float	dist, w2;
	vertex	v1, v2, v3, v4;

	w2 = width / 2.0f;

	dx = p1.x - p2.x;
	dy = p1.y - p2.y;
	dist = sqrt(dx*dx + dy*dy);
	dx /= dist;
	dy /= dist;

	v1.x = p1.x + w2 * dy;
	v1.y = p1.y - w2 * dx;

	v2.x = p1.x - w2 * dy;
	v2.y = p1.y + w2 * dx;

	v3.x = p2.x + w2 * dy;
	v3.y = p2.y - w2 * dx;

	v4.x = p2.x - w2 * dy;
	v4.y = p2.y + w2 * dx;

	if (end_cap == 0) // No end cap. Do nothing
	{
	}else if (end_cap == 1){ // Square end cap
		v1.x += dx * w2;
		v1.y += dy * w2;

		v2.x += dx * w2;
		v2.y += dy * w2;

		v3.x -= dx * w2;
		v3.y -= dy * w2;

		v4.x -= dx * w2;
		v4.y -= dy * w2;
	}else if (end_cap == 2){ // Round end cap
		float	theta;
		float	tangetial_factor;
		float	radial_factor;
		float	angle;
		float	x, y;
		int	i;

		angle = atan2(p2.y - p1.y,p2.x - p1.x);

		theta = 3.14159265 / float(num_segments - 1);
		tangetial_factor = tanf(theta);
		radial_factor = cosf(theta);

		x = w2 * cosf(angle + 1.5707);
		y = w2 * sinf(angle + 1.5707);

		glBegin(GL_TRIANGLE_FAN);
			glColor3f(0.0, 0.0, 1.0); // Blue, 'cause I like blue...
			for (i = 0; i < num_segments; i++)
			{
				vertex	v = { x,y };

				float tx = -y;
				float ty = x;

				x += tx * tangetial_factor;
				y += ty * tangetial_factor;

				x *= radial_factor;
				y *= radial_factor;

				glVertex2f(p1.x, p1.y);
				glVertex2f(p1.x + v.x, p1.y + v.y);
				glVertex2f(p1.x + x, p1.y + y);

				glVertex2f(p2.x, p2.y);
				glVertex2f(p2.x - v.x, p2.y - v.y);
				glVertex2f(p2.x - x, p2.y - y);
			}
		glEnd();
	}

	glBegin(GL_TRIANGLES);
		glColor3f(0.0, 0.0, 1.0); // Blue, 'cause I like blue...

		glVertex2f(v1.x, v1.y);
		glVertex2f(v2.x, v2.y);
		glVertex2f(v3.x, v3.y);

		glVertex2f(v2.x, v2.y);
		glVertex2f(v3.x, v3.y);
		glVertex2f(v4.x, v4.y);
	glEnd();
}
Sorry for all of the edits. I've been having fun playing with this. Edited by MarkS

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!