func onStart(glctx gl.Context, sz size.Event) { log.Printf("creating GL program") var err error keystate = map[touch.Sequence]int{} program, err = glutil.CreateProgram(glctx, vertexShader, fragmentShader) if err != nil { log.Printf("error creating GL program: %v", err) return } glctx.Enable(gl.DEPTH_TEST) position = glctx.GetAttribLocation(program, "position") texCordIn = glctx.GetAttribLocation(program, "texCordIn") color = glctx.GetUniformLocation(program, "color") drawi = glctx.GetUniformLocation(program, "drawi") projection = glctx.GetUniformLocation(program, "projection") camera = glctx.GetUniformLocation(program, "camera") loadTexture(glctx) glctx.UseProgram(program) projectionMat := mgl32.Perspective(mgl32.DegToRad(75.0), float32(1), 0.5, 40.0) glctx.UniformMatrix4fv(projection, projectionMat[:]) cameraMat := mgl32.LookAtV(mgl32.Vec3{0.5, 0, 1.5}, mgl32.Vec3{0, 0, 0}, mgl32.Vec3{0, 1, 0}) glctx.UniformMatrix4fv(camera, cameraMat[:]) board = NewBoard(glctx, float32(0.05), 10) numKeys := len(board.bigKeys) + len(board.smallKeys) InitializeSound(numKeys) }
func (prg Program) Mat4(ctx gl.Context, dst gl.Uniform, src f32.Mat4) { ctx.UniformMatrix4fv(dst, []float32{ src[0][0], src[1][0], src[2][0], src[3][0], src[0][1], src[1][1], src[2][1], src[3][1], src[0][2], src[1][2], src[2][2], src[3][2], src[0][3], src[1][3], src[2][3], src[3][3], }) }
func (prg Program) Mat4(ctx gl.Context, dst gl.Uniform, src f32.Mat4) { m := make([]float32, 16) for i, v := range src { for j, x := range v { m[i*4+j] = x } } ctx.UniformMatrix4fv(dst, m) }
func onPaint(glctx gl.Context, sz size.Event) { //gl.Enable(gl.DEPTH_TEST) //gl.DepthFunc(gl.LESS) //清场 glctx.ClearColor(1, 1, 1, 1) //设置背景颜色 glctx.Clear(gl.COLOR_BUFFER_BIT) glctx.Clear(gl.DEPTH_BUFFER_BIT) //使用program glctx.UseProgram(program) //gl.Uniform4f(color, 0, 0.5, 0.8, 1)//设置color对象值,设置4个浮点数. //offset有两个值X,Y,窗口左上角为(0,0),右下角为(1,1) //gl.Uniform4f(offset,5.0,1.0,1.0,1.0 ) //gl.Uniform2f(offset,offsetx,offsety )//为2参数的uniform变量赋值 //log.Println("offset:",offsetx,offsety, 0, 0) glctx.UniformMatrix4fv(scan, []float32{ touchLocX/float32(sz.WidthPt)*4 - 2, 0, 0, 0, 0, touchLocY/float32(sz.HeightPt)*4 - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, }) /*glVertexAttribPointer 指定了渲染时索引值为 index 的顶点属性数组的数据格式和位置。调用gl.vertexAttribPointer()方法, 把顶点着色器中某个属性相对应的通用属性索引连接到绑定的webGLBUffer对象上。 index 指定要修改的顶点属性的索引值 size 指定每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。(如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a)) type 指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。 normalized 指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)。 stride 指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。 pointer 指定第一个组件在数组的第一个顶点属性中的偏移量。该数组与GL_ARRAY_BUFFER绑定,储存于缓冲区中。初始值为0; */ glctx.BindBuffer(gl.ARRAY_BUFFER, positionbuf) glctx.EnableVertexAttribArray(position) defer glctx.DisableVertexAttribArray(position)//必须全部缓存导入完成后再关闭 glctx.VertexAttribPointer(position, coordsPerVertex, gl.FLOAT, false, 0, 0) //导入position缓存 glctx.DrawArrays(gl.TRIANGLES, 0, vertexCount) glctx.BindBuffer(gl.ARRAY_BUFFER, colorbuf) glctx.EnableVertexAttribArray(color) defer glctx.DisableVertexAttribArray(color)//必须全部缓存导入完成后再关闭 glctx.VertexAttribPointer(color, colorsPerVertex, gl.FLOAT, false, 0, 0) //导入color缓存 glctx.DrawArrays(gl.TRIANGLES, 0, vertexCount) fps.Draw(sz) }
func onPaint(glctx gl.Context, sz size.Event) { glctx.Viewport(0, 0, sz.WidthPx, sz.HeightPx) glctx.ClearColor(0.5, 0.5, 0.5, 1) glctx.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) glctx.UseProgram(program) projectionMtx = mgl32.Perspective(45, float32(width)/float32(height), 0.1, 100) arcBallMtx := arcball.getMtx() glctx.UniformMatrix4fv(projection, projectionMtx[:]) glctx.UniformMatrix4fv(view, arcBallMtx[:]) glctx.BindBuffer(gl.ARRAY_BUFFER, triBuf) glctx.EnableVertexAttribArray(position) glctx.EnableVertexAttribArray(color) glctx.EnableVertexAttribArray(normals) vertSize := 4 * (coordsPerVertex + colorPerVertex + normalsPerVertex) glctx.VertexAttribPointer(position, coordsPerVertex, gl.FLOAT, false, vertSize, 0) glctx.VertexAttribPointer(color, colorPerVertex, gl.FLOAT, false, vertSize, 4*coordsPerVertex) glctx.VertexAttribPointer(normals, normalsPerVertex, gl.FLOAT, false, vertSize, 4*(coordsPerVertex+colorPerVertex)) glctx.DepthMask(true) glctx.Uniform3fv(lightPos, light.Pos[:]) glctx.Uniform3fv(lightIntensity, light.Intensities[:]) for _, k := range piano.Keys { glctx.Uniform4fv(tint, k.Color[:]) mtx := k.GetMtx() normMat := mtx.Mat3().Inv().Transpose() glctx.UniformMatrix3fv(normalMatrix, normMat[:]) glctx.UniformMatrix4fv(model, mtx[:]) glctx.DrawArrays(gl.TRIANGLES, 0, len(triangleData)/vertSize) } modelMtx := mgl32.Ident4() modelMtx = modelMtx.Mul4(mgl32.Translate3D(worldPos.X(), worldPos.Y(), worldPos.Z())) modelMtx = modelMtx.Mul4(mgl32.Scale3D(0.5, 0.5, 0.5)) /* glctx.Uniform4fv(tint, red[:]) // Disable depthmask so we dont get the pixel depth of the cursor cube glctx.DepthMask(false) glctx.UniformMatrix4fv(model, modelMtx[:]) glctx.DepthMask(true) */ glctx.DisableVertexAttribArray(position) glctx.DisableVertexAttribArray(color) glctx.DisableVertexAttribArray(normals) fps.Draw(sz) }