2013-07-27 27 views
3

是否可以創建一個C++自定義矩陣類,以便我們可以將此類的實例傳遞給glUniformMatrix?換句話說就是將這個類的實例傳遞給頂點着色器。如何將自定義C++矩陣類傳遞給glUniformMatrix

我問這個問題,因爲當我做了一個計算機圖形課程,我們給了一個代碼骨架的opengl和glsl着色器編程。在代碼框架中,我們有一個名爲mat4的自定義C++矩陣類。這個類包含了很多方法和用戶定義的構造函數。但仍然將mat4的實例用作glUniformMatrix的參數,並且此實例在頂點着色器中正確轉換爲類型mat4。

未來我想用GLM library來創建opengl代碼與頂點/片段着色器之間的接口,但我想了解哪些數據類型可以傳遞給glUniformMatrix的規則和語義,以便這種類型的實例將在頂點着色器中正確轉換爲統一的mat4。

我認爲關鍵,這種行爲定義操作

operator GLfloat*(); 
operator const GLfloat*() const; 

返回static_cast<const GLfloat*>(...)到矩陣數據結構的開頭這樣它將指向所有矩陣列式的方式。這是廣泛的筆觸GLM圖書館是如何工作的?

+0

是否使用了天使圖形教科書中的代碼?它使用你在帖子中描述的機制,允許你簡單地將變量名稱傳遞給'glUniformMatrix'。一般來說,C++狂熱者不喜歡這些方法,但它們在這種情況下很有用。 GLM不使用相同的機制,但如果需要,您可以從這些類中派生出來添加這些方法。就我個人而言,我喜歡轉換操作符,因爲其他方法依賴於公開類的實現。 – radical7

+0

我記得我在Google搜索中找到了天使代碼,它看起來與我們的計算機圖形學課程代碼中的代碼相同。我認爲課程人員使用天使代碼並調整它以符合課程約定。 – DontCareBear

回答

2

各種glUniformMatrx*fv()函數期望矩陣是一系列GLfloat值(mat4爲16),連續地放置在內存中,因此將指針傳遞給C/C++一維或二維浮點數組將會起作用。

GLM使用以下兩種變體

glm::mat4 m; 
glUniform4fv(location, 1, GL_FALSE, &m[0][0]); 
// or 
glUniform4fv(location, 1, GL_FALSE, glm::value_ptr(m)); 

他們明確地避免實施一些機制來隱藏操作,altough這將是很容易實現。

相關問題