esnho

10-05-2011, 01:04 PM

Hi,

I'm new in this forum and I'm new to openGL and shading languages.

I'm writing in GLSL a geometry shader that pick a line strip vertices and transform it to looks like a filled stroke, it's like a tape; it's a triangles strip.

I started my work from this shader https://github.com/openframeworks/openFr...aders/geom.glsl (https://github.com/openframeworks/openFrameworks/blob/master/apps/examples/geometryShaderExample/bin/data/shaders/geom.glsl)

THE PROBLEM: the problem is that now my shader scale the width of the strip processing it segment by segment; the scaling is based on the length of the segment; but this approach cause a big eye gap between small and big segment.

To solve this I thought to do a little buffer with the last segment width and start the next segment and to do a little control at the first vertex to don't fall in error assigning it a width which doesn't exists.

It doesn't work.

I don't manage why, the control point always think we are at the first vertex. Is not a simple error I think, I checked also after a walk with the dog :) .

Here is the shader:

///////////////////////////////

// GLSL shaders

// PARAMETERS PASSED TO SHADERS

// float thickness default=0.1

// float limiter default=0.2

// vec3 lightDir default= 0.0 0.04 1.0

// line_strip vertices

////////////////

// VERTEX SHADER

#version 120

uniform float limiter;

void main(void)

{

// just bit waving

vec4 wave = vec4(gl_Vertex[0],gl_Vertex[1],gl_Vertex[2]*sin(gl_Vertex[0]),gl_Vertex[3]);

gl_FrontColor = gl_Color;

gl_Position = wave;

}

//////////////////

// GEOMETRY SHADER

// input type: GL_LINES

// output type: GL_TRIANGLE_STRIP

// vertices out: 4

/***********************************************

*

* Based on:

* Geometry shader to convert lines into triangle strips

* Memo Akten

* www.memo.tv

************************************************/

#version 120

#extension GL_EXT_geometry_shader4 : enable

uniform float thickness;

uniform vec3 lightDir;

uniform float limiter;

void main(void) {

// actual working vertices

vec3 p0;

vec3 p1;

vec3 dir; // normalized direction vector from p0 to p1

vec3 thick; // thick vector

vec3 oldthick; // old thick vector

float thickM; // thick modifier

vec3 norm;

// distance calculation stuff

vec2 P;

vec2 Q;

// color stuff

float fColMult;

vec4 colMult;

// loop stuff

int i;

bool first = true;

vec3 up = vec3(0, 0, 1); // arbitrary up vector

// go trought the vertices and do the transformation

for(i=0; i<gl_VerticesIn; i++){

if (first == true) { // maybe isn't a good way do a big control like this but is for debugging

first = false; // seems this doesn't work

// set working vertices

p0 = gl_PositionIn[i].xyz;

p1 = gl_PositionIn[i+1].xyz;

// some calculations

dir = normalize(p1 - p0);

thick = normalize(cross(dir, up));

norm = cross(thick, dir);

fColMult = abs(dot(norm, lightDir)); // simple lighting

P = vec2(p0[0],p0[1]);

Q = vec2(p1[0],p1[1]);

thickM = distance(P,Q)+0.02; // the lenght of the segment influeces his thickness

if (thickM > limiter) { // clipping

thickM = limiter;

}

thick *= thickness*thickM; // set calculated thickness

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 - thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 + thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 - thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i+1].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 + thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i+1].rgb * fColMult, 1.0);

EmitVertex();

oldthick = thick;

} else {

p0 = gl_PositionIn[i].xyz;

p1 = gl_PositionIn[i+1].xyz;

dir = normalize(p1 - p0);

thick = normalize(cross(dir, up));

norm = cross(thick, dir);

fColMult = abs(dot(norm, lightDir)); // simple lighting

P = vec2(p0[0],p0[1]);

Q = vec2(p1[0],p1[1]);

thickM = distance(P,Q)+0.02; // the lenght of the segment influeces his thickness

if (thickM > limiter) { // clipping

thickM = limiter;

}

thick *= thickness*thickM; // set calculated thickness

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 - oldthick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 + oldthick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 - thick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i+1] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 + thick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i+1] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

oldthick = thick; // update the starting dimension

}

}

}

//////////////////

// FRAGMENT SHADER

void main (void) // do nothing

{

gl_FragColor = gl_Color;

}

What is wrong? This is my first approach to opengl and shading and I'm learning everything via web.

You are my masters.

Thank you for the attention.

I'm new in this forum and I'm new to openGL and shading languages.

I'm writing in GLSL a geometry shader that pick a line strip vertices and transform it to looks like a filled stroke, it's like a tape; it's a triangles strip.

I started my work from this shader https://github.com/openframeworks/openFr...aders/geom.glsl (https://github.com/openframeworks/openFrameworks/blob/master/apps/examples/geometryShaderExample/bin/data/shaders/geom.glsl)

THE PROBLEM: the problem is that now my shader scale the width of the strip processing it segment by segment; the scaling is based on the length of the segment; but this approach cause a big eye gap between small and big segment.

To solve this I thought to do a little buffer with the last segment width and start the next segment and to do a little control at the first vertex to don't fall in error assigning it a width which doesn't exists.

It doesn't work.

I don't manage why, the control point always think we are at the first vertex. Is not a simple error I think, I checked also after a walk with the dog :) .

Here is the shader:

///////////////////////////////

// GLSL shaders

// PARAMETERS PASSED TO SHADERS

// float thickness default=0.1

// float limiter default=0.2

// vec3 lightDir default= 0.0 0.04 1.0

// line_strip vertices

////////////////

// VERTEX SHADER

#version 120

uniform float limiter;

void main(void)

{

// just bit waving

vec4 wave = vec4(gl_Vertex[0],gl_Vertex[1],gl_Vertex[2]*sin(gl_Vertex[0]),gl_Vertex[3]);

gl_FrontColor = gl_Color;

gl_Position = wave;

}

//////////////////

// GEOMETRY SHADER

// input type: GL_LINES

// output type: GL_TRIANGLE_STRIP

// vertices out: 4

/***********************************************

*

* Based on:

* Geometry shader to convert lines into triangle strips

* Memo Akten

* www.memo.tv

************************************************/

#version 120

#extension GL_EXT_geometry_shader4 : enable

uniform float thickness;

uniform vec3 lightDir;

uniform float limiter;

void main(void) {

// actual working vertices

vec3 p0;

vec3 p1;

vec3 dir; // normalized direction vector from p0 to p1

vec3 thick; // thick vector

vec3 oldthick; // old thick vector

float thickM; // thick modifier

vec3 norm;

// distance calculation stuff

vec2 P;

vec2 Q;

// color stuff

float fColMult;

vec4 colMult;

// loop stuff

int i;

bool first = true;

vec3 up = vec3(0, 0, 1); // arbitrary up vector

// go trought the vertices and do the transformation

for(i=0; i<gl_VerticesIn; i++){

if (first == true) { // maybe isn't a good way do a big control like this but is for debugging

first = false; // seems this doesn't work

// set working vertices

p0 = gl_PositionIn[i].xyz;

p1 = gl_PositionIn[i+1].xyz;

// some calculations

dir = normalize(p1 - p0);

thick = normalize(cross(dir, up));

norm = cross(thick, dir);

fColMult = abs(dot(norm, lightDir)); // simple lighting

P = vec2(p0[0],p0[1]);

Q = vec2(p1[0],p1[1]);

thickM = distance(P,Q)+0.02; // the lenght of the segment influeces his thickness

if (thickM > limiter) { // clipping

thickM = limiter;

}

thick *= thickness*thickM; // set calculated thickness

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 - thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 + thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 - thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i+1].rgb * fColMult, 1.0);

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 + thick, 1.0);

gl_FrontColor = vec4(gl_FrontColorIn[i+1].rgb * fColMult, 1.0);

EmitVertex();

oldthick = thick;

} else {

p0 = gl_PositionIn[i].xyz;

p1 = gl_PositionIn[i+1].xyz;

dir = normalize(p1 - p0);

thick = normalize(cross(dir, up));

norm = cross(thick, dir);

fColMult = abs(dot(norm, lightDir)); // simple lighting

P = vec2(p0[0],p0[1]);

Q = vec2(p1[0],p1[1]);

thickM = distance(P,Q)+0.02; // the lenght of the segment influeces his thickness

if (thickM > limiter) { // clipping

thickM = limiter;

}

thick *= thickness*thickM; // set calculated thickness

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 - oldthick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p0 + oldthick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 - thick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i+1] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

gl_Position = gl_ModelViewProjectionMatrix * vec4(p1 + thick, 1.0);

//gl_FrontColor = gl_FrontColorIn[i+1] * fColMult;

gl_FrontColor = vec4(1.0,0.0,0.0,1.0); // if the is processed i surely see this

EmitVertex();

oldthick = thick; // update the starting dimension

}

}

}

//////////////////

// FRAGMENT SHADER

void main (void) // do nothing

{

gl_FragColor = gl_Color;

}

What is wrong? This is my first approach to opengl and shading and I'm learning everything via web.

You are my masters.

Thank you for the attention.