diff options
Diffstat (limited to 'advanced_opengl/8.geometry_shader/shaders')
11 files changed, 227 insertions, 0 deletions
diff --git a/advanced_opengl/8.geometry_shader/shaders/base.fs b/advanced_opengl/8.geometry_shader/shaders/base.fs new file mode 100644 index 0000000..283d885 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/base.fs @@ -0,0 +1,11 @@ +#version 330 core + +in vec3 fcolor; + +out vec4 frag_color; + +void +main(void) +{ + frag_color = vec4(fcolor, 1.0f); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/base.gs b/advanced_opengl/8.geometry_shader/shaders/base.gs new file mode 100644 index 0000000..6b140c5 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/base.gs @@ -0,0 +1,27 @@ +#version 330 core +layout(points) in; +layout(triangle_strip, max_vertices = 5) out; + +in VS_OUT { + vec3 color; +} gs_in[]; + +out vec3 fcolor; + +void +main(void) +{ + fcolor = gs_in[0].color; + gl_Position = gl_in[0].gl_Position+vec4(-0.2, -0.2, 0.0, 0.0); + EmitVertex(); + gl_Position = gl_in[0].gl_Position+vec4(0.2, -0.2, 0.0, 0.0); + EmitVertex(); + gl_Position = gl_in[0].gl_Position+vec4(-0.2, 0.2, 0.0, 0.0); + EmitVertex(); + gl_Position = gl_in[0].gl_Position+vec4(0.2, 0.2, 0.0, 0.0); + EmitVertex(); + fcolor = vec3(1.0, 1.0, 1.0); + gl_Position = gl_in[0].gl_Position+vec4(0.0, 0.4, 0.0, 0.0); + EmitVertex(); + EndPrimitive(); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/base.vs b/advanced_opengl/8.geometry_shader/shaders/base.vs new file mode 100644 index 0000000..2924e6c --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/base.vs @@ -0,0 +1,14 @@ +#version 330 core +layout(location = 0) in vec2 apos; +layout(location = 1) in vec3 acolor; + +out VS_OUT { + vec3 color; +} vs_out; + +void +main(void) +{ + vs_out.color = acolor; + gl_Position = vec4(apos, 0.0f, 1.0f); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/basic.fs b/advanced_opengl/8.geometry_shader/shaders/basic.fs new file mode 100644 index 0000000..bdd4b9a --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/basic.fs @@ -0,0 +1,13 @@ +#version 330 core + +in vec2 tex_coords; + +out vec4 frag_color; + +uniform sampler2D texture1; + +void +main(void) +{ + frag_color = texture(texture1, tex_coords); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/basic.vs b/advanced_opengl/8.geometry_shader/shaders/basic.vs new file mode 100644 index 0000000..9a630b6 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/basic.vs @@ -0,0 +1,16 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 2) in vec2 atex_coords; + +out vec2 tex_coords; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void +main(void) +{ + gl_Position = projection*view*model*vec4(apos, 1.0f); + tex_coords = atex_coords; +} diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.fs b/advanced_opengl/8.geometry_shader/shaders/explosion.fs new file mode 100644 index 0000000..70e7151 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/explosion.fs @@ -0,0 +1,13 @@ +#version 330 core + +in vec2 ftex_coords; + +out vec4 frag_color; + +uniform sampler2D texture0; + +void +main(void) +{ + frag_color = texture(texture0, ftex_coords); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.gs b/advanced_opengl/8.geometry_shader/shaders/explosion.gs new file mode 100644 index 0000000..1883ad2 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/explosion.gs @@ -0,0 +1,44 @@ +#version 330 core +layout(triangles) in; +layout(triangle_strip, max_vertices = 3) out; + +in VS_OUT { + vec2 gtex_coords; +} gs_in[]; + +out vec2 ftex_coords; + +uniform float time; + +vec3 +get_normal(void) +{ + vec3 a = vec3(gl_in[0].gl_Position)-vec3(gl_in[1].gl_Position); + vec3 b = vec3(gl_in[2].gl_Position)-vec3(gl_in[1].gl_Position); + return(normalize(cross(a, b))); +} + +vec4 +explode(vec4 position, vec3 normal) +{ + float magnitude = 0.2f; + vec3 direction = normal*magnitude*((sin(time)+1.0f)/2.0f); + vec4 result = position+vec4(direction, 0.0f); + return(result); +} + +void +main(void) +{ + vec3 normal = get_normal(); + gl_Position = explode(gl_in[0].gl_Position, normal); + ftex_coords = gs_in[0].gtex_coords; + EmitVertex(); + gl_Position = explode(gl_in[1].gl_Position, normal); + ftex_coords = gs_in[1].gtex_coords; + EmitVertex(); + gl_Position = explode(gl_in[2].gl_Position, normal); + ftex_coords = gs_in[2].gtex_coords; + EmitVertex(); + EndPrimitive(); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/explosion.vs b/advanced_opengl/8.geometry_shader/shaders/explosion.vs new file mode 100644 index 0000000..5925b8f --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/explosion.vs @@ -0,0 +1,18 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 1) in vec2 atex_coords; + +out VS_OUT { + vec2 gtex_coords; +} vs_out; + +uniform mat4 projection; +uniform mat4 view; +uniform mat4 model; + +void +main(void) +{ + vs_out.gtex_coords = atex_coords; + gl_Position = projection*view*model*vec4(apos, 1.0f); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.fs b/advanced_opengl/8.geometry_shader/shaders/normals.fs new file mode 100644 index 0000000..fbbafbf --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/normals.fs @@ -0,0 +1,9 @@ +#version 330 core + +out vec4 frag_color; + +void +main(void) +{ + frag_color = vec4(1.0, 0.0, 0.0, 1.0); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.gs b/advanced_opengl/8.geometry_shader/shaders/normals.gs new file mode 100644 index 0000000..3720a5f --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/normals.gs @@ -0,0 +1,44 @@ +#version 330 core +layout(triangles) in; +layout(line_strip, max_vertices = 6) out; + +in VS_OUT { + vec3 normal; +} gs_in[]; + +uniform mat4 projection; + +const float MAGNITUDE = 0.4; + +void +generate_line(int index) +{ + gl_Position = projection*gl_in[index].gl_Position; + EmitVertex(); + gl_Position = projection*(gl_in[index].gl_Position+ + vec4(gs_in[index].normal, 0.0)*MAGNITUDE); + EmitVertex(); + EndPrimitive(); +} + +void +main(void) +{ + /* + vec4 center = (gl_in[0].gl_Position+ + gl_in[1].gl_Position+ + gl_in[2].gl_Position)/3.0; + vec4 end = center+vec4(((gs_in[0].normal+ + gs_in[1].normal+ + gs_in[2].normal)/3.0), + 0.0)*MAGNITUDE; + gl_Position = projection*center; + EmitVertex(); + gl_Position = projection*end; + EmitVertex(); + EndPrimitive(); + */ + generate_line(0); + generate_line(1); + generate_line(2); +} diff --git a/advanced_opengl/8.geometry_shader/shaders/normals.vs b/advanced_opengl/8.geometry_shader/shaders/normals.vs new file mode 100644 index 0000000..3b728e5 --- /dev/null +++ b/advanced_opengl/8.geometry_shader/shaders/normals.vs @@ -0,0 +1,18 @@ +#version 330 core +layout(location = 0) in vec3 apos; +layout(location = 1) in vec3 anormal; + +out VS_OUT { + vec3 normal; +} vs_out; + +uniform mat4 view; +uniform mat4 model; + +void +main(void) +{ + mat3 normal_matrix = mat3(transpose(inverse(view*model))); + vs_out.normal = normalize(normal_matrix*anormal); + gl_Position = view*model*vec4(apos, 1.0); +} |