学习OpenTk,笔记六
学习OpenGL、OpenTK
1、接上篇投影矩阵的源码分析
glm::ortho和Matrix4.CreateOrthographicOffCenter源码一致,根据示例里面的进行代码翻译改造
改造如下:
public Matrix4 GLMOrthographic(float left , float right, float bottom, float top)//glm::ortho { var result = Matrix4.Identity; result.Row0.X = 2 / (right - left); result.Row1.Y = 2 / (top - bottom); result.Row2.Z = 1; result.Row3.X = -(right + left) / (right - left); result.Row3.Y = -(top + bottom) / (top - bottom); return result; }
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
/*
第一个参数你现在应该很熟悉了,它是uniform的位置值。
第二个参数告诉OpenGL我们将要发送多少个矩阵,这里是1。
第三个参数询问我们是否希望对我们的矩阵进行转置(Transpose),也就是说交换我们矩阵的行和列。
OpenGL开发者通常使用一种内部矩阵布局,叫做列主序(Column-major Ordering)布局。
GLM的默认布局就是列主序,所以并不需要转置矩阵,我们填GL_FALSE
。
最后一个参数是真正的矩阵数据,但是GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据。
*/
GL.UniformMatrix4(_uniformLocations[name], false, ref data);
然后就可以渲染文本了,原先给的例子里面没有渲染文本的一块,其中的LearnOpenTK中调用UniformMatrix4函数transpose参数使用true和C++示例中使用false有点误导,需要明白参数的左右是行列转换,目前就是默认的列主序,GLM也是使用列主序,不需要额外转换。本身给的学习示例还是太少,扩展学C++的示例。参考:https://github.com/opentk/LearnOpenTK/blob/master/Common/Shader.cs 和 https://learnopengl.com/code_viewer.php?code=in-practice/text_rendering
2、OpenTK内的函数基本都是OpenGL转换过来,在源码https://github.com/opentk/opentk/tree/master/src/Generator.Bind/Specifications/Docs 中可以看到,函数名基本一致,去除了一些后缀,C++的代码很容易移植后使用
3、音频库可以使用NAudio https://github.com/naudio/NAudio 用得非常广泛,园子里有很多文章
4、https://github.com/liuww111/LearnOpenTK4 这是本人学习的例子,可以参考
5、多素材加载的时候要注意释放资源,养成良好习惯,避免冲突,比如VAO和VBO,使用完要记得释放资源,避免其他地方绑定资源的时候冲突,特别是自己封装对象的时候
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); GL.BindVertexArray(0);