func initialize(c *opengl.Context) error { shaderVertexModelviewNative, err := c.NewShader(c.VertexShader, shader(c, shaderVertexModelview)) if err != nil { return err } defer c.DeleteShader(shaderVertexModelviewNative) shaderVertexColorNative, err := c.NewShader(c.VertexShader, shader(c, shaderVertexColor)) if err != nil { return err } defer c.DeleteShader(shaderVertexColorNative) shaderVertexColorLineNative, err := c.NewShader(c.VertexShader, shader(c, shaderVertexColorLine)) if err != nil { return err } defer c.DeleteShader(shaderVertexColorLineNative) shaderFragmentTextureNative, err := c.NewShader(c.FragmentShader, shader(c, shaderFragmentTexture)) if err != nil { return err } defer c.DeleteShader(shaderFragmentTextureNative) shaderFragmentSolidNative, err := c.NewShader(c.FragmentShader, shader(c, shaderFragmentSolid)) if err != nil { return err } defer c.DeleteShader(shaderFragmentSolidNative) programTexture, err = c.NewProgram([]opengl.Shader{ shaderVertexModelviewNative, shaderFragmentTextureNative, }) if err != nil { return err } programSolidRect, err = c.NewProgram([]opengl.Shader{ shaderVertexColorNative, shaderFragmentSolidNative, }) if err != nil { return err } programSolidLine, err = c.NewProgram([]opengl.Shader{ shaderVertexColorLineNative, shaderFragmentSolidNative, }) if err != nil { return err } // 16 [bytse] is an arbitrary number which seems enough to draw anything. Fix this if necessary. const stride = 16 c.NewBuffer(c.ArrayBuffer, 4*stride*quadsMaxNum, c.DynamicDraw) indices := make([]uint16, 6*quadsMaxNum) for i := uint16(0); i < quadsMaxNum; i++ { indices[6*i+0] = 4*i + 0 indices[6*i+1] = 4*i + 1 indices[6*i+2] = 4*i + 2 indices[6*i+3] = 4*i + 1 indices[6*i+4] = 4*i + 2 indices[6*i+5] = 4*i + 3 } indexBufferQuads = c.NewBuffer(c.ElementArrayBuffer, indices, c.StaticDraw) indices = make([]uint16, indicesNum) for i := 0; i < len(indices); i++ { indices[i] = uint16(i) } indexBufferLines = c.NewBuffer(c.ElementArrayBuffer, indices, c.StaticDraw) return nil }