summaryrefslogtreecommitdiff
path: root/graphics.go
diff options
context:
space:
mode:
Diffstat (limited to 'graphics.go')
-rw-r--r--graphics.go55
1 files changed, 41 insertions, 14 deletions
diff --git a/graphics.go b/graphics.go
index 7107926..fc195eb 100644
--- a/graphics.go
+++ b/graphics.go
@@ -13,6 +13,7 @@ import (
var (
vertices []float32
+ vertex_normals []float32
)
const (
@@ -21,21 +22,33 @@ const (
VERTEX_SHADER = `
#version 410
- uniform mat4 trafo;
+ in vec3 vp_model; // vertex position in model coordinate system
+ in vec3 vn_model; // vertex normal in model coordinate system
- in vec3 vp;
+ uniform mat4 trafo; // one single transformation matrix
+
+ out vec3 vn_eye; // vertex normal in eye coordinate system
void main() {
- gl_Position = trafo * vec4(vp, 1.0);
+ vn_eye = vec3(trafo * vec4(vn_model, 0.0)); // 0.0 because translation is ignored
+ gl_Position = trafo * vec4(vp_model, 1.0);
}
` + "\x00"
// fragment shader to draw surfaces
FRAGMENT_SHADER = `
#version 410
+
+ in vec3 vn_eye; // vertex normal in eye coordinate system
+
out vec4 frag_colour;
+
void main() {
- frag_colour = vec4(0, 0, 1, 1); // RGBA color format
+ vec3 ambient = vec3(0.3, 0.3, 0.3); // ambient colour is static
+ vec3 light_vector_eye = vec3(1.0, 0.1, -1.0);
+ vec3 diffuse = (vec3(1, 1, 1) - ambient) * max(dot(normalize(vn_eye), normalize(light_vector_eye)), 0.0);
+ vec3 color = (ambient + diffuse) * vec3(0, 0, 1); // hard-coded vector is color in RGB format
+ frag_colour = vec4(color, 1.0); // RGBA color format
}
` + "\x00"
)
@@ -79,10 +92,11 @@ func newGraphics() Graphics {
graphics.program = gl.CreateProgram()
gl.AttachShader(graphics.program, graphics.vertexShader)
gl.AttachShader(graphics.program, graphics.fragmentShader)
+ gl.Enable(gl.DEPTH_TEST)
gl.LinkProgram(graphics.program)
// create VAO
- graphics.vao = makeVao(vertices)
+ graphics.vao = makeVao(vertices, vertex_normals)
// create transformation matrix
//graphics.trafo = mgl32.HomogRotate3D(float32(glfw.GetTime()) * OMEGA, mgl32.Vec3{ROT_X, ROT_Y, ROT_Z})
@@ -100,26 +114,39 @@ func (graphics Graphics) draw() {
gl.UniformMatrix4fv(graphics.trafoUniform, 1, false, &graphics.trafo[0])
gl.BindVertexArray(graphics.vao)
- gl.DrawArrays(gl.LINE_STRIP, 0, int32(len(vertices)/3)) // POINTS, LINES, LINE_STRIP, LINE_LOOP, TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN
+ gl.DrawArrays(gl.TRIANGLES, 0, int32(len(vertices)/3)) // POINTS, LINES, LINE_STRIP, LINE_LOOP, TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN
}
// makeVao initializes and returns a vertex array from the points provided.
-func makeVao(points []float32) uint32 {
+func makeVao(points []float32, normals []float32) uint32 {
log.Println("Creating VAO")
- // start with vertex buffer object (VBO):
- var vbo uint32 // VBO ID
- gl.GenBuffers(1, &vbo)
- gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
+ // vertex buffer object (VBO) for positions:
+ var position_vbo uint32 // VBO ID
+ gl.GenBuffers(1, &position_vbo)
+ gl.BindBuffer(gl.ARRAY_BUFFER, position_vbo)
gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW)
- // vertex array objects (VAO) are a feature of newer GL implementations:
+ // vertex buffer object (VBO) for normals:
+ var normal_vbo uint32 // VBO ID
+ gl.GenBuffers(1, &normal_vbo)
+ gl.BindBuffer(gl.ARRAY_BUFFER, normal_vbo)
+ gl.BufferData(gl.ARRAY_BUFFER, 4*len(normals), gl.Ptr(normals), gl.STATIC_DRAW)
+
+ // vertex array objects (VAO) to combine VBOs:
var vao uint32 // VAO ID
gl.GenVertexArrays(1, &vao)
gl.BindVertexArray(vao)
- gl.EnableVertexAttribArray(0)
- gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
+
+ // connect position_vbo to vao
+ gl.BindBuffer(gl.ARRAY_BUFFER, position_vbo)
gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil) // tell GL to use 3D float vectors
+ gl.EnableVertexAttribArray(0)
+
+ // connect normal_vbo to vao
+ gl.BindBuffer(gl.ARRAY_BUFFER, normal_vbo)
+ gl.VertexAttribPointer(1, 3, gl.FLOAT, false, 0, nil) // tell GL to use 3D float vectors
+ gl.EnableVertexAttribArray(1)
return vao
}