QQ交流群:110826636

学习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);

 

posted @ 2023-04-11 08:46  FourOne  阅读(214)  评论(0编辑  收藏  举报