C#现代OpenGL笔记

项目做了一个学期还在拖着,假期接手跑了的组员负责的3D仿真部分,这两天差不多是把这部分做完了,顺便做个记录。
c#上使用opengl用的sharpgl,当前版本2.4,看样子也不会更新了,本来想用计算着色器做点后期效果,结果只支持到OpenGL4.0,说好的4.3呢?
这里写图片描述
看了一圈源码发现都是直接用委托调用opengl的dll,试着照着写了一下新函数结果不行,估计还需要改点别的,导师也说没必要花时间在这个上,就放弃了。


上张效果图
这里写图片描述
这几天把实现过程(踩到的坑)写一遍,加深一下印象。

VAO与VBO,数据传输
VAO(Vertex Array Object)顶点对象数组与VBO(Vertex Buffer Object)顶点缓存对象类似数组下标与数据的关系,物体的顶点数据(位置、颜色、法向量等)存放在VBO中,并利用相关函数设定各数据所在位置。

 float[] verts =
 {
     -1.0f, -1.0f, 0.0f, 0.0f, 0.0f,
      1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
      1.0f,  1.0f, 0.0f, 1.0f, 1.0f,
     -1.0f,  1.0f, 0.0f, 0.0f, 1.0f,
 };
 gl.GenVertexArrays(1, bufferVAO);
 gl.BindVertexArray(bufferVAO[0]);
 gl.GenBuffers(1, buffer2D);
 gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, buffer2D[0]);
 IntPtr p = Marshal.AllocHGlobal(verts.Length * sizeof(float));
 Marshal.Copy(verts, 0, p, verts.Length);
 gl.BufferData(OpenGL.GL_ARRAY_BUFFER, verts.Length * sizeof(float), p, OpenGL.GL_STATIC_DRAW);
 Marshal.FreeHGlobal(p);
 gl.EnableVertexAttribArray(0);
 gl.EnableVertexAttribArray(1);
 gl.VertexAttribPointer(0, 3, OpenGL.GL_FLOAT, false, (5 * sizeof(float)), (IntPtr)null);
 gl.VertexAttribPointer(1, 2, OpenGL.GL_FLOAT, false, (5 * sizeof(float)), (IntPtr)(3 * sizeof(float)));

verts数组含有4个顶点,每组数据位5个float,前三个代表x、y、z位置信息,后两个为纹理坐标。该数组设定了一个铺屏四边形以便调试;

gl.GenVertexArrays(1, bufferVAO);
gl.BindVertexArray(bufferVAO[0]);
gl.GenBuffers(1, buffer2D);
gl.BindBuffer(OpenGL.GL_ARRAY_BUFFER, buffer2D[0]);

这四行为生成vao、绑定vao,生成vbo,绑定vbo。随后将verts数据传入vbo。

IntPtr p = Marshal.AllocHGlobal(verts.Length * sizeof(float));
Marshal.Copy(verts, 0, p, verts.Length);
gl.BufferData(OpenGL.GL_ARRAY_BUFFER, verts.Len
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值