// OpenGL draw function func draw() { gl.Clear(gl.COLOR_BUFFER_BIT) gl.Enable(gl.BLEND) gl.Enable(gl.POINT_SMOOTH) gl.Enable(gl.LINE_SMOOTH) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.LoadIdentity() gl.Begin(gl.LINES) gl.Color3f(.2, .2, .2) for i := range staticLines { x := staticLines[i].GetAsSegment().A.X y := staticLines[i].GetAsSegment().A.Y gl.Vertex3f(float32(x), float32(y), 0) x = staticLines[i].GetAsSegment().B.X y = staticLines[i].GetAsSegment().B.Y gl.Vertex3f(float32(x), float32(y), 0) } gl.End() gl.Color4f(.3, .3, 1, .8) // draw balls for _, ball := range balls { gl.PushMatrix() pos := ball.Body.Position() rot := ball.Body.Angle() * chipmunk.DegreeConst gl.Translatef(float32(pos.X), float32(pos.Y), 0.0) gl.Rotatef(float32(rot), 0, 0, 1) drawCircle(float64(ballRadius), 60) gl.PopMatrix() } }
func (t *Texture) PreloadRender() { t.Bind() gl.Begin(gl.QUADS) gl.TexCoord2f(0, 1) gl.Vertex3f(0, 0, 1) gl.TexCoord2f(1, 1) gl.Vertex3f(0, 0, 1) gl.TexCoord2f(1, 0) gl.Vertex3f(0, 0, 1) gl.TexCoord2f(0, 0) gl.Vertex3f(0, 0, 1) gl.End() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.LoadIdentity() // 重置当前矩阵 texture.Bind(gl.TEXTURE_2D) var x_m, y_m, z_m, u_m, v_m float32 xtrans := -xpos ztrans := -zpos ytrans := -walkbias - 0.25 sceneroty := 360.0 - yrot var numtriangles int gl.Rotatef(lookupdown, 1.0, 0, 0) gl.Rotatef(sceneroty, 0, 1.0, 0) gl.Translatef(xtrans, ytrans, ztrans) numtriangles = sector1.numtriangles // Process Each Triangle for loop_m := 0; loop_m < numtriangles; loop_m++ { gl.Begin(gl.TRIANGLES) gl.Normal3f(0.0, 0.0, 1.0) x_m = sector1.triangles[loop_m].vertex[0].x y_m = sector1.triangles[loop_m].vertex[0].y z_m = sector1.triangles[loop_m].vertex[0].z u_m = sector1.triangles[loop_m].vertex[0].u v_m = sector1.triangles[loop_m].vertex[0].v gl.TexCoord2f(u_m, v_m) gl.Vertex3f(x_m, y_m, z_m) x_m = sector1.triangles[loop_m].vertex[1].x y_m = sector1.triangles[loop_m].vertex[1].y z_m = sector1.triangles[loop_m].vertex[1].z u_m = sector1.triangles[loop_m].vertex[1].u v_m = sector1.triangles[loop_m].vertex[1].v gl.TexCoord2f(u_m, v_m) gl.Vertex3f(x_m, y_m, z_m) x_m = sector1.triangles[loop_m].vertex[2].x y_m = sector1.triangles[loop_m].vertex[2].y z_m = sector1.triangles[loop_m].vertex[2].z u_m = sector1.triangles[loop_m].vertex[2].u v_m = sector1.triangles[loop_m].vertex[2].v gl.TexCoord2f(u_m, v_m) gl.Vertex3f(x_m, y_m, z_m) gl.End() } }
func RenderAtlas(a Atlas) { a.Bind() xratio := float32(a.Width()) / float32(a.Height()) gl.Begin(gl.QUADS) gl.TexCoord2f(0, 1) gl.Vertex3f(-0.5, -0.5, 1) gl.TexCoord2f(1, 1) gl.Vertex3f((xratio)-0.5, -0.5, 1) gl.TexCoord2f(1, 0) gl.Vertex3f((xratio)-0.5, 0.5, 1) gl.TexCoord2f(0, 0) gl.Vertex3f(-0.5, 0.5, 1) gl.End() }
func (t *Texture) Render() { t.Bind() xratio := float32(t.width) / float32(t.height) gl.Begin(gl.QUADS) gl.TexCoord2f(0, 1) gl.Vertex3f(-0.5, -0.5, 1) gl.TexCoord2f(1, 1) gl.Vertex3f((xratio)-0.5, -0.5, 1) gl.TexCoord2f(1, 0) gl.Vertex3f((xratio)-0.5, 0.5, 1) gl.TexCoord2f(0, 0) gl.Vertex3f(-0.5, 0.5, 1) gl.End() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) texture.Bind(gl.TEXTURE_2D) for loop = 0; loop < num; loop++ { gl.LoadIdentity() // 绘制每颗星星之前,重置模型观察矩阵 gl.Translatef(0.0, 0.0, zoom) // 深入屏幕里面 gl.Rotatef(tilt, 1.0, 0.0, 0.0) // 倾斜视角 gl.Rotatef(ztilt, 0.0, 0.0, 1.0) // 倾斜视角 gl.Rotatef(star[loop].angle, 0.0, 1.0, 0.0) // 旋转至当前所画星星的角度 gl.Translatef(star[loop].dist, 0.0, 0.0) // 沿X轴正向移动 gl.Rotatef(-star[loop].angle, 0.0, 1.0, 0.0) // 取消当前星星的角度 gl.Rotatef(-ztilt, 0.0, 0.0, 1.0) // 取消屏幕倾斜 gl.Rotatef(-tilt, 1.0, 0.0, 0.0) // 取消屏幕倾斜 if twinkle { // 启用闪烁效果 // 使用byte型数值指定一个颜色 gl.Color4ub(star[(num-loop)-1].r, star[(num-loop)-1].g, star[(num-loop)-1].b, 255) gl.Begin(gl.QUADS) // 开始绘制纹理映射过的四边形 gl.TexCoord2f(0.0, 0.0) gl.Vertex3f(-1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 0.0) gl.Vertex3f(1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 1.0) gl.Vertex3f(1.0, 1.0, 0.0) gl.TexCoord2f(0.0, 1.0) gl.Vertex3f(-1.0, 1.0, 0.0) gl.End() // 四边形绘制结束 } gl.Rotatef(spin, 0.0, 0.0, 1.0) // 绕z轴旋转星星 // 使用byte型数值指定一个颜色 gl.Color4ub(star[loop].r, star[loop].g, star[loop].b, 255) gl.Begin(gl.QUADS) // 开始绘制纹理映射过的四边形 gl.TexCoord2f(0.0, 0.0) gl.Vertex3f(-1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 0.0) gl.Vertex3f(1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 1.0) gl.Vertex3f(1.0, 1.0, 0.0) gl.TexCoord2f(0.0, 1.0) gl.Vertex3f(-1.0, 1.0, 0.0) gl.End() // 四边形绘制结束 spin += 0.01 // 星星的公转 star[loop].angle += float32(loop) / num // 改变星星的自转角度 star[loop].dist -= 0.01 // 改变星星离中心的距离 if star[loop].dist < 0.0 { // 星星到达中心了么 star[loop].dist += 5 // 往外移5个单位 //fmt.Println(loop, star[loop].dist) star[loop].r = uint8(rand.Int() % 256) // 赋一个新红色分量 star[loop].g = uint8(rand.Int() % 256) // 赋一个新绿色分量 star[loop].b = uint8(rand.Int() % 256) // 赋一个新蓝色分量 } } }
// drawCircle draws a circle for the specified radius, rotation angle, and the specified number of sides func drawCircle(radius float64, sides int) { gl.Begin(gl.LINE_LOOP) for a := 0.0; a < 2*math.Pi; a += (2 * math.Pi / float64(sides)) { gl.Vertex2d(math.Sin(a)*radius, math.Cos(a)*radius) } gl.Vertex3f(0, 0, 0) gl.End() }
func (v *Video) Render() { for running { select { case dimensions := <-v.resize: v.ResizeEvent(dimensions[0], dimensions[1]) case val := <-v.tick: slice := make([]uint8, len(val)*3) for i := 0; i < len(val); i = i + 1 { slice[i*3+0] = (uint8)((val[i] >> 16) & 0xff) slice[i*3+1] = (uint8)((val[i] >> 8) & 0xff) slice[i*3+2] = (uint8)((val[i]) & 0xff) } gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) v.tex.Bind(gl.TEXTURE_2D) if ppu.OverscanEnabled { gl.TexImage2D(gl.TEXTURE_2D, 0, 3, 240, 224, 0, gl.RGB, gl.UNSIGNED_BYTE, slice) } else { gl.TexImage2D(gl.TEXTURE_2D, 0, 3, 256, 240, 0, gl.RGB, gl.UNSIGNED_BYTE, slice) } gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.Begin(gl.QUADS) gl.TexCoord2f(0.0, 1.0) gl.Vertex3f(-1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 1.0) gl.Vertex3f(1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 0.0) gl.Vertex3f(1.0, 1.0, 0.0) gl.TexCoord2f(0.0, 0.0) gl.Vertex3f(-1.0, 1.0, 0.0) gl.End() if v.screen != nil { sdl.GL_SwapBuffers() } v.frametick <- true } } }
func draw() { // 从这里开始进行所有的绘制 gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // 清除屏幕和深度缓存 gl.LoadIdentity() // 重置当前的模型观察矩阵 gl.Translatef(-1.5, 0.0, -6.0) // 左移 1.5 单位,并移入屏幕 6.0 gl.Rotatef(rtri, 0.0, 1.0, 0.0) // 绕Y轴旋转三角形 gl.Begin(gl.TRIANGLES) // 绘制三角形 gl.Color3f(1.0, 0.0, 0.0) // 设置当前色为红色 gl.Vertex3f(0.0, 1.0, 0.0) // 上顶点 gl.Color3f(0.0, 1.0, 0.0) // 设置当前色为绿色 gl.Vertex3f(-1.0, -1.0, 0.0) // 左下 gl.Color3f(0.0, 0.0, 1.0) // 设置当前色为蓝色 gl.Vertex3f(1.0, -1.0, 0.0) // 右下 gl.End() // 三角形绘制结束 gl.LoadIdentity() // 重置当前的模型观察矩阵 gl.Translatef(1.5, 0.0, -6.0) // 右移1.5单位,并移入屏幕 6.0 gl.Rotatef(rquad, 1.0, 0.0, 0.0) // 绕X轴旋转四边形 gl.Color3f(0.5, 0.5, 1.0) // 一次性将当前色设置为蓝色 gl.Begin(gl.QUADS) // 绘制正方形 gl.Vertex3f(-1.0, 1.0, 0.0) // 左上 gl.Vertex3f(1.0, 1.0, 0.0) // 右上 gl.Vertex3f(1.0, -1.0, 0.0) // 左下 gl.Vertex3f(-1.0, -1.0, 0.0) // 右下 gl.End() rtri += 0.2 // 增加三角形的旋转变量 rquad -= 0.15 // 减少四边形的旋转变量 }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.LoadIdentity() gl.Translatef(-1.5, 0, -6) gl.Rotatef(trisAngle, 0, 1, 0) gl.Begin(gl.TRIANGLES) gl.Color3f(1, 0, 0) gl.Vertex3f(0, 1, 0) gl.Color3f(0, 1, 0) gl.Vertex3f(-1, -1, 0) gl.Color3f(0, 0, 1) gl.Vertex3f(1, -1, 0) gl.End() gl.LoadIdentity() gl.Translatef(1.5, 0, -6) gl.Rotatef(quadAngle, 1, 0, 0) gl.Color3f(0.5, 0.5, 1.0) gl.Begin(gl.QUADS) gl.Vertex3f(-1, 1, 0) gl.Vertex3f(1, 1, 0) gl.Vertex3f(1, -1, 0) gl.Vertex3f(-1, -1, 0) gl.End() trisAngle += 0.2 quadAngle -= 0.15 glfw.SwapBuffers() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) /// 清除屏幕及深度缓存 gl.LoadIdentity() /// 重置模型观察矩阵 gl.Translatef(-1.5, 0, -6) /// 左移 1.5 单位,并移入屏幕 6.0 gl.Begin(gl.TRIANGLES) /// 绘制三角形 gl.Color3f(1, 0, 0) /// 设置当前色为红色 gl.Vertex3f(0, 1, 0) ///上顶点 gl.Color3f(0, 1, 0) /// 设置当前色为绿色 gl.Vertex3f(-1, -1, 0) /// 左下 gl.Color3f(0, 0, 1) ///设置当前色为蓝色 gl.Vertex3f(1, -1, 0) ///右下 gl.End() ///三角形绘制结束,三角形将被填充。 //但是因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,并刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。 gl.Translatef(3, 0, 0) ///右移3单位 gl.Color3f(0.5, 0.5, 1.0) ///一次性将当前色设置为蓝色 /// @note 顺时针绘制的正方形意味着我们所看见的是四边形的背面 gl.Begin(gl.QUADS) ///绘制正方形 gl.Vertex3f(-1, 1, 0) /// 左上 gl.Vertex3f(1, 1, 0) /// 右上 gl.Vertex3f(1, -1, 0) /// 右下 gl.Vertex3f(-1, -1, 0) /// 左下 gl.End() ///正方形绘制结束 glfw.SwapBuffers() ///必须交换显示区才能展现 }
// Draws the contents of the framebuffer at the requested width and height. func (fb *Framebuffer) Draw(w int, h int) { gl.Viewport(0, 0, w, h) gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() gl.Ortho(0, 1, 0, 1, 1, -1) gl.Enable(gl.TEXTURE_2D) fb.Texture.Bind(gl.TEXTURE_2D) gl.MatrixMode(gl.MODELVIEW) gl.LoadIdentity() gl.Begin(gl.QUADS) gl.TexCoord2d(0, 0) gl.Vertex3f(0.0, 0.0, 0) gl.TexCoord2d(1, 0) gl.Vertex3f(1.0, 0.0, 0) gl.TexCoord2d(1, 1) gl.Vertex3f(1.0, 1.0, 0) gl.TexCoord2d(0, 1) gl.Vertex3f(0.0, 1.0, 0) gl.End() gl.Flush() }
func (v *Video) Render(frame []byte, frame_w int, frame_h int) { gl.Clear(gl.COLOR_BUFFER_BIT) v.Texture.Bind(gl.TEXTURE_2D) gl.TexImage2D(gl.TEXTURE_2D, 0, 3, frame_w, frame_h, 0, gl.RGB, gl.UNSIGNED_BYTE, frame) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.Begin(gl.QUADS) gl.TexCoord2f(0.0, 1.0) gl.Vertex3f(-1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 1.0) gl.Vertex3f(1.0, -1.0, 0.0) gl.TexCoord2f(1.0, 0.0) gl.Vertex3f(1.0, 1.0, 0.0) gl.TexCoord2f(0.0, 0.0) gl.Vertex3f(-1.0, 1.0, 0.0) gl.End() glfw.SwapBuffers() }
// vertex draws vertices. // Used in classic render mode. func (a *Attr) vertex(i int) { i *= a.size switch a.size { case 2: switch v := a.data.(type) { case []int16: gl.Vertex2s(v[i], v[i+1]) case []int32: gl.Vertex2i(int(v[i]), int(v[i+1])) case []float32: gl.Vertex2f(v[i], v[i+1]) case []float64: gl.Vertex2d(v[i], v[i+1]) } case 3: switch v := a.data.(type) { case []int16: gl.Vertex3s(v[i], v[i+1], v[i+2]) case []int32: gl.Vertex3i(int(v[i]), int(v[i+1]), int(v[i+2])) case []float32: gl.Vertex3f(v[i], v[i+1], v[i+2]) case []float64: gl.Vertex3d(v[i], v[i+1], v[i+2]) } case 4: switch v := a.data.(type) { case []int16: gl.Vertex4s(v[i], v[i+1], v[i+2], v[i+3]) case []int32: gl.Vertex4i(int(v[i]), int(v[i+1]), int(v[i+2]), int(v[i+3])) case []float32: gl.Vertex4f(v[i], v[i+1], v[i+2], v[i+3]) case []float64: gl.Vertex4d(v[i], v[i+1], v[i+2], v[i+3]) } } }
func draw() { // 从这里开始进行所有的绘制 gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // 清除屏幕和深度缓存 gl.LoadIdentity() // 重置当前的模型观察矩阵 gl.Translatef(-1.5, 0.0, -6.0) // 左移 1.5 单位,并移入屏幕 6.0 gl.Begin(gl.TRIANGLES) // 绘制三角形 gl.Vertex3f(0.0, 1.0, 0.0) // 上顶点 gl.Vertex3f(-1.0, -1.0, 0.0) // 左下 gl.Vertex3f(1.0, -1.0, 0.0) // 右下 gl.End() // 三角形绘制结束 gl.Translatef(3.0, 0.0, 0.0) // 右移3单位 gl.Begin(gl.QUADS) // 绘制正方形 gl.Vertex3f(-1.0, 1.0, 0.0) // 左上 gl.Vertex3f(1.0, 1.0, 0.0) // 右上 gl.Vertex3f(1.0, -1.0, 0.0) // 左下 gl.Vertex3f(-1.0, -1.0, 0.0) // 右下 gl.End() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) /// 清除屏幕及深度缓存 gl.LoadIdentity() /// 重置模型观察矩阵 gl.Translatef(-1.5, 0, -6) /// 左移 1.5 单位,并移入屏幕 6.0 gl.Rotatef(trisAngle, 0, 1, 0) ///以y为轴 参数:角度,X,Y,Z gl.Begin(gl.TRIANGLES) /// 绘制三角形 gl.Color3f(1, 0, 0) /// 设置当前色为红色 gl.Vertex3f(0, 1, 0) ///上顶点 gl.Color3f(0, 1, 0) /// 设置当前色为绿色 gl.Vertex3f(-1, -1, 0) /// 左下 gl.Color3f(0, 0, 1) ///设置当前色为蓝色 gl.Vertex3f(1, -1, 0) ///右下 gl.End() ///三角形绘制结束,三角形将被填充。 //但是因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,并刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。 /// 要让对象绕自身的轴旋转,必须让对象的中心坐标总是(0.0f,0,0f,0,0f),因此这里的四边形是满屏跑的 gl.LoadIdentity() ///将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。 ///OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。 gl.Rotatef(quadAngle, 1, 0, 0) /// 以x为轴 gl.Translatef(1.5, 0, -6) ///以当前点为起始点移动?(是的)-6为距离 //gl.Translatef(3, 0, -6); ///右移3单位,看不见?(因为loadIdentity()置中了) gl.Color3f(0.5, 0.5, 1.0) ///一次性将当前色设置为蓝色 /// @note 顺时针绘制的正方形意味着我们所看见的是四边形的背面 gl.Begin(gl.QUADS) ///绘制正方形 gl.Vertex3f(-1, 1, 0) /// 左上 gl.Vertex3f(1, 1, 0) /// 右上 gl.Vertex3f(1, -1, 0) /// 右下 gl.Vertex3f(-1, -1, 0) /// 左下 gl.End() ///正方形绘制结束 trisAngle += 0.2 quadAngle -= 0.15 glfw.SwapBuffers() ///必须交换显示区才能展现 }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) //清除屏幕和深度缓存 gl.LoadIdentity() //重置当前的模型观察矩阵 gl.Translatef(0, 0, z) //移入/移出屏幕 z 个单位 gl.Rotatef(rotation[0], 1, 0, 0) //绕X轴旋转 gl.Rotatef(rotation[1], 0, 1, 0) //绕Y轴旋转 rotation[0] += speed[0] rotation[1] += speed[1] textures[filter].Bind(gl.TEXTURE_2D) //绑定的纹理 /* Normal就是法线的意思,所谓法线是指经过面(多边形)上的一点且垂直于这个面(多边形)的直线。 使用光源的时候必须指定一条法线。法线告诉OpenGL这个多边形的朝向,并指明多边形的正面和背面。 如果没有指定法线,什么怪事情都可能发生:不该照亮的面被照亮了,多边形的背面也被照亮....。对了,法线应该指向多边形的外侧。 看着木箱的前面您会注意到法线与Z轴正向同向。这意味着法线正指向观察者-您自己。这正是我们所希望的。 对于木箱的背面,也正如我们所要的,法线背对着观察者。 如果立方体沿着X或Y轴转个180度的话,前侧面的法线仍然朝着观察者,背面的法线也还是背对着观察者。 换句话说,不管是哪个面,只要它朝着观察者这个面的法线就指向观察者。由于光源紧邻观察者,任何时候法线对着观察者时,这个面就会被照亮。 并且法线越朝着光源,就显得越亮一些。如果您把观察点放到立方体内部,你就会法线里面一片漆黑。因为法线是向外指的。 如果立方体内部没有光源的话,当然是一片漆黑。 */ gl.Begin(gl.QUADS) // Front Face 前面 gl.Normal3f(0, 0, 1) // Normal Pointing Towards Viewer 法线指向观察者 gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, 1) // Point 1 (Front) gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, 1) // Point 2 (Front) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, 1) // Point 3 (Front) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, 1) // Point 4 (Front) // Back Face 后面 gl.Normal3f(0, 0, -1) // Normal Pointing Away From Viewer 法线背向观察者 gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, -1) // Point 1 (Back) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, -1) // Point 2 (Back) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, -1) // Point 3 (Back) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, -1) // Point 4 (Back) // Top Face 顶面 gl.Normal3f(0, 1, 0) // Normal Pointing Up 法线向上 gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) // Point 1 (Top) gl.TexCoord2f(0, 0) gl.Vertex3f(-1, 1, 1) // Point 2 (Top) gl.TexCoord2f(1, 0) gl.Vertex3f(1, 1, 1) // Point 3 (Top) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Point 4 (Top) // Bottom Face 底面 gl.Normal3f(0, -1, 0) // Normal Pointing Down 法线朝下 gl.TexCoord2f(1, 1) gl.Vertex3f(-1, -1, -1) // Point 1 (Bottom) gl.TexCoord2f(0, 1) gl.Vertex3f(1, -1, -1) // Point 2 (Bottom) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Point 3 (Bottom) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Point 4 (Bottom) // Right face 右面 gl.Normal3f(1, 0, 0) // Normal Pointing Right 法线朝右 gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, -1) // Point 1 (Right) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Point 2 (Right) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, 1) // Point 3 (Right) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Point 4 (Right) // Left Face 左面 gl.Normal3f(-1, 0, 0) // Normal Pointing Left 法线朝左 gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, -1) // Point 1 (Left) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Point 2 (Left) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, 1) // Point 3 (Left) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) gl.End() glfw.SwapBuffers() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) /// 清除屏幕及深度缓存 gl.LoadIdentity() /// 重置模型观察矩阵 gl.Translatef(0, 0, -5) /// 并移入屏幕 5.0 gl.Rotatef(rotation[0], 1, 0, 0) ///以x为轴旋转 参数:角度,X,Y,Z gl.Rotatef(rotation[1], 0, 1, 0) gl.Rotatef(rotation[2], 0, 0, 1) rotation[0] += 0.3 rotation[1] += 0.2 rotation[2] += 0.4 /* 选择我们使用的纹理。如果您在您的场景中使用多个纹理, 应该使用来 glBindTexture(GL_TEXTURE_2D, texture[ 所使用纹理对应的数字 ]) 选择要绑定的纹理。 当想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理, 必须在 glBegin() 之前或 glEnd() 之后绑定。注意在后面是如何使用 glBindTexture 来指定和绑定纹理的。 */ textures[0].Bind(gl.TEXTURE_2D) ///选择纹理 /* 为了将纹理正确的映射到四边形上,必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角, 纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。 如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。 glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。 所以纹理的左上坐标是 X:0.0f,Y:1.0f ,四边形的左上顶点是 X: -1.0f,Y:1.0f 。其余三点依此类推。 */ gl.Begin(gl.QUADS) ///绘制正方形 gl.TexCoord2f(0, 0) ///前面 gl.Vertex3f(-1, -1, 1) ///左下 gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, 1) ///右下 gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, 1) ///右上 gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, 1) ///左上 gl.TexCoord2d(1, 0) ///后面 gl.Vertex3f(-1, -1, -1) ///右下 gl.TexCoord2d(1, 1) gl.Vertex3f(-1, 1, -1) ///右上 gl.TexCoord2d(0, 1) gl.Vertex3f(1, 1, -1) ///左上 gl.TexCoord2d(0, 0) gl.Vertex3f(1, -1, -1) //左下 gl.TexCoord2d(0, 1) ///上面 gl.Vertex3f(-1, 1, -1) gl.TexCoord2d(0, 0) gl.Vertex3f(-1, 1, 1) gl.TexCoord2d(1, 0) gl.Vertex3f(1, 1, 1) gl.TexCoord2d(1, 1) gl.Vertex3f(1, 1, -1) gl.TexCoord2d(1, 1) ///下面 gl.Vertex3f(-1, -1, -1) gl.TexCoord2d(0, 1) gl.Vertex3f(1, -1, -1) gl.TexCoord2d(0, 0) gl.Vertex3f(1, -1, 1) gl.TexCoord2d(1, 0) gl.Vertex3f(-1, -1, -1) gl.TexCoord2d(1, 0) ///右面 gl.Vertex3f(1, -1, -1) gl.TexCoord2d(1, 1) gl.Vertex3f(1, 1, -1) gl.TexCoord2d(0, 1) gl.Vertex3f(1, 1, 1) gl.TexCoord2d(0, 0) gl.Vertex3f(1, -1, 1) gl.TexCoord2d(0, 0) ///左面 gl.Vertex3f(-1, -1, -1) gl.TexCoord2d(1, 0) gl.Vertex3f(-1, -1, 1) gl.TexCoord2d(1, 1) gl.Vertex3f(-1, 1, 1) gl.TexCoord2d(0, 1) gl.Vertex3f(-1, 1, -1) gl.End() ///正方形绘制结束 glfw.SwapBuffers() ///必须交换显示区才能展现 }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.LoadIdentity() gl.Translatef(0, 0, z) gl.Rotatef(rotation[0], 1, 0, 0) gl.Rotatef(rotation[1], 0, 1, 0) rotation[0] += speed[0] rotation[1] += speed[1] textures[filter].Bind(gl.TEXTURE_2D) gl.Begin(gl.QUADS) // Front Face gl.Normal3f(0, 0, 1) // Normal Pointing Towards Viewer gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, 1) // Point 1 (Front) gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, 1) // Point 2 (Front) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, 1) // Point 3 (Front) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, 1) // Point 4 (Front) // Back Face gl.Normal3f(0, 0, -1) // Normal Pointing Away From Viewer gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, -1) // Point 1 (Back) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, -1) // Point 2 (Back) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, -1) // Point 3 (Back) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, -1) // Point 4 (Back) // Top Face gl.Normal3f(0, 1, 0) // Normal Pointing Up gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) // Point 1 (Top) gl.TexCoord2f(0, 0) gl.Vertex3f(-1, 1, 1) // Point 2 (Top) gl.TexCoord2f(1, 0) gl.Vertex3f(1, 1, 1) // Point 3 (Top) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Point 4 (Top) // Bottom Face gl.Normal3f(0, -1, 0) // Normal Pointing Down gl.TexCoord2f(1, 1) gl.Vertex3f(-1, -1, -1) // Point 1 (Bottom) gl.TexCoord2f(0, 1) gl.Vertex3f(1, -1, -1) // Point 2 (Bottom) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Point 3 (Bottom) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Point 4 (Bottom) // Right face gl.Normal3f(1, 0, 0) // Normal Pointing Right gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, -1) // Point 1 (Right) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Point 2 (Right) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, 1) // Point 3 (Right) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Point 4 (Right) // Left Face gl.Normal3f(-1, 0, 0) // Normal Pointing Left gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, -1) // Point 1 (Left) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Point 2 (Left) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, 1) // Point 3 (Left) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) gl.End() glfw.SwapBuffers() }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.MatrixMode(gl.MODELVIEW) gl.LoadIdentity() gl.Translatef(0, 0, -3.0) gl.Rotatef(rotx, 1, 0, 0) gl.Rotatef(roty, 0, 1, 0) rotx += 0.5 roty += 0.5 texture.Bind(gl.TEXTURE_2D) gl.Color4f(1, 1, 1, 1) gl.Begin(gl.QUADS) gl.Normal3f(0, 0, 1) gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, 1) gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, 1) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, 1) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, 1) gl.Normal3f(0, 0, -1) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, -1) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, -1) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, -1) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, -1) gl.Normal3f(0, 1, 0) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) gl.TexCoord2f(0, 0) gl.Vertex3f(-1, 1, 1) gl.TexCoord2f(1, 0) gl.Vertex3f(1, 1, 1) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) gl.Normal3f(0, -1, 0) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, -1, -1) gl.TexCoord2f(0, 1) gl.Vertex3f(1, -1, -1) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) gl.Normal3f(1, 0, 0) gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, -1) gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, 1) gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) gl.Normal3f(-1, 0, 0) gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, -1) gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, 1) gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) gl.End() }
func draw() { // 从这里开始进行所有的绘制 gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // 清除屏幕和深度缓存 gl.LoadIdentity() // 重置当前的模型观察矩阵 gl.Translatef(-1.5, 0.0, -6.0) // 左移 1.5 单位,并移入屏幕 6.0 gl.Rotatef(rtri, 0.0, 1.0, 0.0) // 绕Y轴旋转三角形 gl.Begin(gl.TRIANGLES) // 绘制三角形 gl.Color3f(1.0, 0.0, 0.0) // 设置当前色为红色 gl.Vertex3f(0.0, 1.0, 0.0) // 三角形的上顶点 (前侧面) gl.Color3f(0.0, 1.0, 0.0) // 设置当前色为绿色 gl.Vertex3f(-1.0, -1.0, 1.0) // 三角形的左下顶点 (前侧面) gl.Color3f(0.0, 0.0, 1.0) // 设置当前色为蓝色 gl.Vertex3f(1.0, -1.0, 1.0) // 三角形的右下顶点 (前侧面) gl.Color3f(1.0, 0.0, 0.0) // 设置当前色为红色 gl.Vertex3f(0.0, 1.0, 0.0) // 三角形的上顶点 (右侧面) gl.Color3f(0.0, 0.0, 1.0) // 设置当前色为蓝色 gl.Vertex3f(1.0, -1.0, 1.0) // 三角形的左下顶点 (右侧面) gl.Color3f(0.0, 1.0, 0.0) // 设置当前色为绿色 gl.Vertex3f(1.0, -1.0, -1.0) // 三角形的右下顶点 (右侧面) gl.Color3f(1.0, 0.0, 0.0) // 设置当前色为红色 gl.Vertex3f(0.0, 1.0, 0.0) // 三角形的上顶点 (后侧面) gl.Color3f(0.0, 0.0, 1.0) // 设置当前色为蓝色 gl.Vertex3f(1.0, -1.0, -1.0) // 三角形的左下顶点 (后侧面) gl.Color3f(0.0, 1.0, 0.0) // 设置当前色为绿色 gl.Vertex3f(-1.0, -1.0, -1.0) // 三角形的右下顶点 (后侧面) gl.Color3f(1.0, 0.0, 0.0) // 设置当前色为红色 gl.Vertex3f(0.0, 1.0, 0.0) // 三角形的上顶点 (左侧面) gl.Color3f(0.0, 0.0, 1.0) // 设置当前色为蓝色 gl.Vertex3f(-1.0, -1.0, -1.0) // 三角形的左下顶点 (左侧面) gl.Color3f(0.0, 1.0, 0.0) // 设置当前色为绿色 gl.Vertex3f(-1.0, -1.0, 1.0) // 三角形的右下顶点 (左侧面) gl.End() // 三角形侧面绘制结束 gl.Begin(gl.QUADS) // 三角形底面绘制形 gl.Vertex3f(1.0, -1.0, -1.0) // 四边形的右上顶点 (底面) gl.Vertex3f(-1.0, -1.0, -1.0) // 四边形的左上顶点 (底面) gl.Vertex3f(-1.0, -1.0, 1.0) // 四边形的左下顶点 (底面) gl.Vertex3f(1.0, -1.0, 1.0) // 四边形的右下顶点 (底面) gl.End() // 三角形底面绘制结束 gl.LoadIdentity() // 重置当前的模型观察矩阵 gl.Translatef(1.5, 0.0, -7.0) // 右移1.5单位,并移入屏幕 6.0 gl.Rotatef(rquad, 1.0, 1.0, 1.0) // 绕X轴旋转四边形 gl.Begin(gl.QUADS) // 绘制正方形 gl.Color3f(1.0, 0.0, 0.0) // 一次性将当前色设置为红色 gl.Vertex3f(1.0, 1.0, -1.0) // 四边形的右上顶点 (顶面) gl.Vertex3f(-1.0, 1.0, -1.0) // 四边形的左上顶点 (顶面) gl.Vertex3f(-1.0, 1.0, 1.0) // 四边形的左下顶点 (顶面) gl.Vertex3f(1.0, 1.0, 1.0) // 四边形的右下顶点 (顶面) gl.Color3f(1.0, 0.5, 0.0) // 一次性将当前色设置为橙色 gl.Vertex3f(1.0, 1.0, 1.0) // 四边形的右上顶点 (前面) gl.Vertex3f(-1.0, 1.0, 1.0) // 四边形的左上顶点 (前面) gl.Vertex3f(-1.0, -1.0, 1.0) // 四边形的左下顶点 (前面) gl.Vertex3f(1.0, -1.0, 1.0) // 四边形的右下顶点 (前面) gl.Color3f(0.0, 0.0, 1.0) // 一次性将当前色设置为绿色 gl.Vertex3f(1.0, 1.0, -1.0) // 四边形的右上顶点 (右面) gl.Vertex3f(1.0, 1.0, 1.0) // 四边形的左上顶点 (右面) gl.Vertex3f(1.0, -1.0, 1.0) // 四边形的左下顶点 (右面) gl.Vertex3f(1.0, -1.0, -1.0) // 四边形的右下顶点 (右面) gl.Color3f(0.0, 1.0, 0.0) // 一次性将当前色设置为蓝色 gl.Vertex3f(-1.0, 1.0, -1.0) // 四边形的右上顶点 (后面) gl.Vertex3f(1.0, 1.0, -1.0) // 四边形的左上顶点 (后面) gl.Vertex3f(1.0, -1.0, -1.0) // 四边形的左下顶点 (后面) gl.Vertex3f(-1.0, -1.0, -1.0) // 四边形的右下顶点 (后面) gl.Color3f(1.0, 1.0, 0.0) // 一次性将当前色设置为黄色 gl.Vertex3f(-1.0, 1.0, 1.0) // 四边形的右上顶点 (左面) gl.Vertex3f(-1.0, 1.0, -1.0) // 四边形的左上顶点 (左面) gl.Vertex3f(-1.0, -1.0, -1.0) // 四边形的左下顶点 (左面) gl.Vertex3f(-1.0, -1.0, 1.0) // 四边形的右下顶点 (左面) gl.Color3f(1.0, 1.0, 1.0) // 一次性将当前色设置为白色 gl.Vertex3f(1.0, -1.0, -1.0) // 四边形的右上顶点 (底面) gl.Vertex3f(-1.0, -1.0, -1.0) // 四边形的左上顶点 (底面) gl.Vertex3f(-1.0, -1.0, 1.0) // 四边形的左下顶点 (底面) gl.Vertex3f(1.0, -1.0, 1.0) // 四边形的右下顶点 (底面) gl.End() rtri += 0.2 // 增加三角形的旋转变量 rquad -= 0.15 // 减少四边形的旋转变量 }
func drawScene() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.LoadIdentity() gl.Translatef(0, 0, -5) gl.Rotatef(rotation[0], 1, 0, 0) gl.Rotatef(rotation[1], 0, 1, 0) gl.Rotatef(rotation[2], 0, 0, 1) rotation[0] += 0.3 rotation[1] += 0.2 rotation[2] += 0.4 textures[0].Bind(gl.TEXTURE_2D) gl.Begin(gl.QUADS) // Front Face gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, 1) // Bottom Left Of The Texture and Quad gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, 1) // Bottom Right Of The Texture and Quad gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, 1) // Top Right Of The Texture and Quad gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, 1) // Top Left Of The Texture and Quad // Back Face gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, -1) // Bottom Right Of The Texture and Quad gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, -1) // Top Right Of The Texture and Quad gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, -1) // Top Left Of The Texture and Quad gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, -1) // Bottom Left Of The Texture and Quad // Top Face gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) // Top Left Of The Texture and Quad gl.TexCoord2f(0, 0) gl.Vertex3f(-1, 1, 1) // Bottom Left Of The Texture and Quad gl.TexCoord2f(1, 0) gl.Vertex3f(1, 1, 1) // Bottom Right Of The Texture and Quad gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Top Right Of The Texture and Quad // Bottom Face gl.TexCoord2f(1, 1) gl.Vertex3f(-1, -1, -1) // Top Right Of The Texture and Quad gl.TexCoord2f(0, 1) gl.Vertex3f(1, -1, -1) // Top Left Of The Texture and Quad gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Bottom Left Of The Texture and Quad gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Bottom Right Of The Texture and Quad // Right face gl.TexCoord2f(1, 0) gl.Vertex3f(1, -1, -1) // Bottom Right Of The Texture and Quad gl.TexCoord2f(1, 1) gl.Vertex3f(1, 1, -1) // Top Right Of The Texture and Quad gl.TexCoord2f(0, 1) gl.Vertex3f(1, 1, 1) // Top Left Of The Texture and Quad gl.TexCoord2f(0, 0) gl.Vertex3f(1, -1, 1) // Bottom Left Of The Texture and Quad // Left Face gl.TexCoord2f(0, 0) gl.Vertex3f(-1, -1, -1) // Bottom Left Of The Texture and Quad gl.TexCoord2f(1, 0) gl.Vertex3f(-1, -1, 1) // Bottom Right Of The Texture and Quad gl.TexCoord2f(1, 1) gl.Vertex3f(-1, 1, 1) // Top Right Of The Texture and Quad gl.TexCoord2f(0, 1) gl.Vertex3f(-1, 1, -1) // Top Left Of The Texture and Quad gl.End() glfw.SwapBuffers() }