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

## 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 on other sites

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 on other sites

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

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;

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

1. 1
Rutin
19
2. 2
3. 3
JoeJ
15
4. 4
5. 5

• 18
• 19
• 10
• 13
• 17
• ### Forum Statistics

• Total Topics
631694
• Total Posts
3001751
×