项目做了一个学期还在拖着,假期接手跑了的组员负责的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