func (scene *Floor) Draw(camera Camera) { shader, _ := scene.UseShader(nil) gl.Enable(gl.STENCIL_TEST) gl.StencilFunc(gl.ALWAYS, 1, 0xFF) gl.StencilOp(gl.KEEP, gl.KEEP, gl.REPLACE) gl.StencilMask(0xFF) gl.DepthMask(false) gl.Clear(gl.STENCIL_BUFFER_BIT) // Draw floor gl.Uniform3fv(shader.Uniform("material.ambient"), []float32{0.1, 0.1, 0.1}) scene.Shape.Draw(shader, camera) // Draw reflections gl.StencilFunc(gl.EQUAL, 1, 0xFF) gl.StencilMask(0x00) gl.DepthMask(true) view := camera.View() gl.Uniform3fv(shader.Uniform("material.ambient"), []float32{0.3, 0.3, 0.3}) for _, node := range scene.reflected { model := node.Transform(scene.transform) gl.UniformMatrix4fv(shader.Uniform("model"), model[:]) normal := model.Mul4(view).Inv().Transpose() gl.UniformMatrix4fv(shader.Uniform("normalMatrix"), normal[:]) node.Draw(camera) } gl.Disable(gl.STENCIL_TEST) }
func (shape *Skybox) Draw(camera Camera) { shader := shape.shader gl.DepthFunc(gl.LEQUAL) gl.DepthMask(false) projection, view := camera.Projection(), camera.View().Mat3().Mat4() gl.UniformMatrix4fv(shader.Uniform("projection"), projection[:]) gl.UniformMatrix4fv(shader.Uniform("view"), view[:]) gl.BindTexture(gl.TEXTURE_CUBE_MAP, shape.Texture) gl.BindBuffer(gl.ARRAY_BUFFER, shape.VBO) gl.EnableVertexAttribArray(shader.Attrib("vertCoord")) gl.VertexAttribPointer(shader.Attrib("vertCoord"), vertexDim, gl.FLOAT, false, shape.Stride(), 0) gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, shape.IBO) gl.DrawElements(gl.TRIANGLES, len(shape.indices), gl.UNSIGNED_BYTE, 0) gl.DisableVertexAttribArray(shader.Attrib("vertCoord")) gl.DepthMask(true) gl.DepthFunc(gl.LESS) }