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) }
// PaintKey will paint the key 1) its own color or 2) red if they key is pressed. func (k *PianoKey) PaintKey(glctx gl.Context, frameData util.FrameData) { glctx.BindBuffer(gl.ARRAY_BUFFER, k.glBuf) glctx.VertexAttribPointer(frameData.Position, coordsPerVertex, gl.FLOAT, false, 0, 0) if k.pressed { // Paint Red if pressed glctx.Uniform4f(frameData.Color, 1, 0, 0, 1) } else { // Paint white if not pressed glctx.Uniform4f(frameData.Color, k.keyColor.Red, k.keyColor.Green, k.keyColor.Blue, 1) } if frameData.Orientation == util.Portrait { glctx.DrawArrays(gl.TRIANGLES, 6, vertexCount) } else if frameData.Orientation == util.Landscape { glctx.DrawArrays(gl.TRIANGLES, 0, vertexCount) } }
func onPaint(glctx gl.Context, sz size.Event) { glctx.ClearColor(1, 0, 0, 1) glctx.Clear(gl.COLOR_BUFFER_BIT) glctx.UseProgram(program) green += 0.01 if green > 1 { green = 0 } glctx.Uniform4f(color, 0, green, 0, 1) glctx.Uniform2f(offset, touchX/float32(sz.WidthPx), touchY/float32(sz.HeightPx)) glctx.BindBuffer(gl.ARRAY_BUFFER, buf) glctx.EnableVertexAttribArray(position) glctx.VertexAttribPointer(position, coordsPerVertex, gl.FLOAT, false, 0, 0) glctx.DrawArrays(gl.TRIANGLES, 0, vertexCount) glctx.DisableVertexAttribArray(position) fps.Draw(sz) }
func (wf *Waveform) Paint(ctx gl.Context, xps, yps, width, height float32) { // TODO this is racey and samples can be in the middle of changing // move the slice copy to Prepare and sync with playback, or feed over chan // TODO assumes mono var ( xstep float32 = width / float32(len(wf.samples)) xpos float32 = xps ) for i, x := range wf.samples { // clip if x > 1 { x = 1 } else if x < -1 { x = -1 } wf.verts[i*3] = float32(xpos) wf.verts[i*3+1] = yps + (height * float32((x+1)/2)) wf.verts[i*3+2] = 0 xpos += xstep } for i, x := range wf.verts { u := math.Float32bits(x) wf.data[4*i+0] = byte(u >> 0) wf.data[4*i+1] = byte(u >> 8) wf.data[4*i+2] = byte(u >> 16) wf.data[4*i+3] = byte(u >> 24) } ctx.UseProgram(wf.program) ctx.Uniform4f(wf.color, 1, 1, 1, 1) // update hw buf and draw ctx.BindBuffer(gl.ARRAY_BUFFER, wf.buf) ctx.EnableVertexAttribArray(wf.position) ctx.VertexAttribPointer(wf.position, 3, gl.FLOAT, false, 0, 0) ctx.BufferSubData(gl.ARRAY_BUFFER, 0, wf.data) ctx.DrawArrays(gl.LINE_STRIP, 0, len(wf.samples)) ctx.DisableVertexAttribArray(wf.position) }
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) }
// This is the main rendering call that updates the current scene and all children in the scene func appPaint(glctx gl.Context, sz size.Event, delta float32) { glctx.ClearColor(currentScene.BGColor.R, currentScene.BGColor.G, currentScene.BGColor.B, currentScene.BGColor.A) glctx.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) for _, child := range currentScene.Children { child.act(delta) child.draw(tempBatch, 1.0) if len(InputChannel) > 0 { for e := range InputChannel { if child.Input != nil { child.Input(child, e) } if len(InputChannel) == 0 { break } } } } glctx.UseProgram(program) green += 0.01 if green > 1 { green = 0 } glctx.Uniform4f(color, 0, green, 0, 1) glctx.Uniform2f(offset, touchX/float32(sz.WidthPx), touchY/float32(sz.HeightPx)) glctx.BindBuffer(gl.ARRAY_BUFFER, buf) glctx.EnableVertexAttribArray(position) glctx.VertexAttribPointer(position, coordsPerVertex, gl.FLOAT, false, 0, 0) glctx.DrawArrays(gl.TRIANGLES, 0, vertexCount) glctx.DisableVertexAttribArray(position) fps.Draw(sz) }
func (btn *Button) Paint(ctx gl.Context) { for i, x := range btn.verts { u := math.Float32bits(x) btn.data[4*i+0] = byte(u >> 0) btn.data[4*i+1] = byte(u >> 8) btn.data[4*i+2] = byte(u >> 16) btn.data[4*i+3] = byte(u >> 24) } ctx.UseProgram(btn.program) if btn.active { ctx.Uniform4f(btn.color, btn.r, btn.g, btn.b, btn.a) } else { ctx.Uniform4f(btn.color, 0.4, 0.4, 0.4, 0.5) } // update hw buf and draw ctx.BindBuffer(gl.ARRAY_BUFFER, btn.buf) ctx.EnableVertexAttribArray(btn.position) ctx.VertexAttribPointer(btn.position, 3, gl.FLOAT, false, 0, 0) ctx.BufferSubData(gl.ARRAY_BUFFER, 0, btn.data) ctx.DrawArrays(gl.TRIANGLES, 0, len(btn.verts)) ctx.DisableVertexAttribArray(btn.position) }
// TODO an Attrib type that describes it's format would be useful here func (prg Program) Pointer(ctx gl.Context, a gl.Attrib, size int) { ctx.EnableVertexAttribArray(a) ctx.VertexAttribPointer(a, size, gl.FLOAT, false, 0, 0) }