Go上的极简OpenGL开发笔记(四)

6 篇文章 1 订阅

这里开始是同时学习 OpenGL的知识和 Go-opengl的函数(大概)

画三角

  • 这部分涉及大量 OpenGL知识

  • 3-dim坐标形式给出三角形的三点坐标
  • 坐标值为规格化的,即 [0, 1]
  • OpenGL的坐标系是
    • 取屏幕的中心点为原点
    • 上y+,右x+ 的标准形式 (Direct3D是矩阵坐标形式)
    • 右上↗点为 (1.0, 1.0),左下↙点 (-1.0, -1.0)
var triangle = []float32 {
	0, 0.5, 0, // (x, y, z) 
	-0.5, -0.5, 0,
	0.5, -0.5, 0,
}

生成一个“顶点数组对象”(VAO)

  • gen 是 generate

  • VBO 顶点缓存对象,是一个 uint32的标号,
    • GenBuffer 指定分配 buffer 的编号
    • 与OpenGL绑定(并指定是VA的类型)
    • 分配 buffer空间(float32 4个字节),静态绘制方式)
  • VAO 顶点数组对象
    • 同理申请生成并绑定、使能
    • 与 vbo绑定,用于获取 vbo的顶点坐标数据
    • 指定读取方式 / 参数指针
      • 0 开头
      • 3 维度xyz
      • float 格式(float32 对应 gl中的内置float)
      • 0 间隔(每两次读取跳过的数据)
      • 其余默认 (nil对应高级玩法)
func genVao(points []float32) uint32 {
	var vbo uint32
    gl.GenBuffers(1, &vbo)
    gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
    gl.BufferData(
    	gl.ARRAY_BUFFER, 
    	4*len(points), 
    	gl.Ptr(points), 
    	gl.STATIC_DRAW,
    )

    var vao uint32
    gl.GenVertexArrays(1, &vao)
    gl.BindVertexArray(vao)
    gl.EnableVertexAttribArray(0)
    gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
    gl.VertexAttribPointer(0, 3, gl.FLOAT, 
    	false, 0, nil)

    return vao
}

main中添加 vao的变量

program := initOpenGL()
vao := genVao(triangle)

修改 draw函数签名 & 本体

  • 这里的再次 bind只是让 gl上下文切换到该 vao上
  • DrawArrays 经典的画三角函数
    • 这里 vao已经“包装”好原始的点集坐标数据,数据对象是一个“点”
    • 0为初始点索引,3(后面的计算式)是点的个数
  • 其余不变
// main()
draw(window, program, vao)

func draw(window *glfw.Window, program uint32, vao uint32) {
    gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
    gl.UseProgram(program)

	// 新添加的两行
    gl.BindVertexArray(vao)
    gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle) / 3))

    glfw.PollEvents()
    window.SwapBuffers()
}

在这里原教程 https://linux.cn/article-8933-1.html 说还要继续操作一波才能看到▲。不过至少在 OpenGL 4.1版本中,可以使用默认的着色器进行绘制了。

Go!

直接 go run main.go,上效果:
在这里插入图片描述

To be continued…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值