func newShaderProgram(ctx *context, vsSource, fsSource string) *shaderProgram { vs := compile(vsSource, gl.VERTEX_SHADER) fs := compile(fsSource, gl.FRAGMENT_SHADER) program := gl.CreateProgram() gl.AttachShader(program, vs) gl.AttachShader(program, fs) gl.LinkProgram(program) if gl.GetProgrami(program, gl.LINK_STATUS) != gl.TRUE { panic(gl.GetProgramInfoLog(program)) } gl.UseProgram(program) checkError() uniformCount := gl.GetProgrami(program, gl.ACTIVE_UNIFORMS) uniforms := make([]shaderUniform, uniformCount) textureUnit := 0 for i := range uniforms { name, size, ty := gl.GetActiveUniform(program, uint32(i)) location := gl.GetUniformLocation(program, name) uniforms[i] = shaderUniform{ name: name, size: size, ty: shaderDataType(ty), location: location, textureUnit: textureUnit, } if ty == gl.SAMPLER_2D { textureUnit++ } } attributeCount := gl.GetProgrami(program, gl.ACTIVE_ATTRIBUTES) attributes := make([]shaderAttribute, attributeCount) for i := range attributes { name, size, ty := gl.GetActiveAttrib(program, uint32(i)) location := gl.GetAttribLocation(program, name) attributes[i] = shaderAttribute{ name: name, size: size, ty: shaderDataType(ty), location: location, } } ctx.stats.shaderProgramCount++ return &shaderProgram{ program: program, uniforms: uniforms, attributes: attributes, } }
func (s *glShader) getUniforms() { s.locations[glnvgLocVIEWSIZE] = gl.GetUniformLocation(s.program, "viewSize") s.locations[glnvgLocTEX] = gl.GetUniformLocation(s.program, "tex") s.locations[glnvgLocFRAG] = gl.GetUniformLocation(s.program, "frag") }