學習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);