diff options
Diffstat (limited to 'graphics.go')
-rw-r--r-- | graphics.go | 55 |
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 } |