[程式] openGL矩陣問題

看板GameDesign作者 (我想要P幣....Orz)時間11年前 (2012/10/23 00:13), 編輯推噓2(209)
留言11則, 2人參與, 最新討論串1/1
※ [本文轉錄自 C_and_CPP 看板 #1GXI-BRO ] 作者: jack0820 (我想要P幣....Orz) 看板: C_and_CPP 標題: [問題] openGL矩陣問題 時間: Mon Oct 22 19:35:37 2012 大家好 小弟最近正在試著看前輩寫一些openGL的東西 在看的過程中遇到一些問題 想很久都搞不懂 覺得應該是觀念問題 因此就上來請教大家了 流程大概是這樣子的 我利用openGL的一些API 幫我設定一些頂點、顏色之類的 最後會透過GPU幫我畫圖 要透過GPU繪圖 似乎是要透過GLSL來達成 簡略的GLSL流程如下: //vertext shader uniform mat4 matModel; uniform mat4 matProj; uniform mat4 matProjModel; attribute vec4 vertex; void main() { ... vec4 tmp = matModel * vertex; gl_position = matProj * tmp; ... } 其實還有其他部分 但我只列出應該是有問題的地方@@ 其中 matModel、matProj都是可以利用openGL的API來設定 自己看的心得是openGL是先分別設定好matModel、matProj之後 才會在shader裡面做相乘的動作 我想說這樣子做應該會很耗費時間 所以想先在C code裡面先設定好matProjModel = matProj * matModel 把matProjModel丟到shader 之後只要在 shader裡面設定 gl_position = matProjModel * vertex; 這樣就可以了 但是結果發現這樣做的結果是錯誤的 看一下兩個矩陣在c code裡的值是固定的 不懂這樣子為何會錯? 簡單來說 為何在c code裡將兩個矩陣相乘後再丟到shader的矩陣 會跟個別在c code裡設定好矩陣然後再丟到shader透過shader幫我做相乘的結果會不相同 (其實也不能確定說結果不同,因為我無法在shader裡將矩陣的值列印出來比較 但至少圖形的結果顯示會不一樣就是了) 查一下矩陣乘法沒有交換律,但有結合律 即A*(B*C) =(A*B)*C 所以這樣做應該是沒有問題 另外也檢查過矩陣相乘,元素值應該是沒乘錯才對 不知道自己還有忽略了甚麼 所以來請教大家 如果講的術語或觀念有錯也希望大家不吝指教 在此也先謝謝大家的幫忙囉 -- 如果愛情能像物理,我將不再困惑於迷惘 如果物理能解迷情,為了妳,我願意苦讀物理 by 陳碩物理~=.= -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.179.30

10/22 20:00, , 1F
也許是因為 openGL 的矩陣是 column major 的?
10/22 20:00, 1F

10/22 22:43, , 2F
推樓上,我覺得原 po 有可能乘錯 XD
10/22 22:43, 2F

10/22 22:44, , 3F
編譯環境沒有 glu 可以用嗎 ?
10/22 22:44, 3F
先感謝樓上兩位大大回應 @@" 我本來也覺得是不是我矩陣乘錯了 但對照一下應該是不會 (code不在手邊~若有需要明天在貼上來@@) 我有看到一個比較奇怪的現象~提出來看看 不知道會不會幫助釐清問題? 之前有提到~ gl_Position = matProj * matModel * vertex 其中matModel為 [0.8, 0 , 0, 0] [0 , 0.5, 0, 0] [0 , 0 , 1, 0] [0.1, 0 ,-6, 1] 現在程式不在手邊,所以只能憑印象打 @@ 詳細的值忘了~但記得對角線與左下角是有值的 根據我查到的心得 是說對角線代表的是圖的縮放 左下角三個值代表的是圖位置的平移 (講錯請指正 @@) 這樣的圖畫出來是顯示在螢幕中間 而且圖應該是在(0.1,0,-6)的位置 為了簡化 我有試著先將 matModel設為單位矩陣 即對角線值全都是1,其他都是0 在 gl_Position = matProj * matModel * vertex 的設定下 依然可以看到圖,只是圖變很大 我的認知是因為z值由-6設為1,而且x,y尺度都設為1,所以圖變大了 現在我用 gl_Position = matProjModel * vertex 即先在C code乘好矩陣再帶進去 在matModel是單位矩陣的情況下也是可以看到一模一樣的大圖 但我將 matModel還原成原本有縮放以及有平移的情況 圖就又看不到了 @_@ 順便問一下~我知道經過投影矩陣變換之後 x,y,z範圍都必須落在-1~1之間 那為啥之前平移設為(0.1,0,-6)依然也可以看到圖呢? 究竟是哪邊想錯了呢? Orz ※ 編輯: jack0820 來自: 114.34.159.175 (10/23 00:07) ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: jack0820 (114.34.159.175), 時間: 10/23/2012 00:13:19

10/24 22:39, , 4F
在shader裡面算不會比較慢喔 ~~
10/24 22:39, 4F

10/24 22:40, , 5F
x,y,z範圍都必須落在-1~1之間 是對的
10/24 22:40, 5F

10/24 22:40, , 6F
平移沒問題是因為投影矩陣幫你投影回 -1~1 之間
10/24 22:40, 6F

10/24 22:41, , 7F
model view 也有縮放 旋轉 位移效果
10/24 22:41, 7F

10/24 23:48, , 8F
不是World Matrix的Scale Rot Translate相乘順序錯了
10/24 23:48, 8F

10/24 23:49, , 9F
不然就是View Matrix or Projection Matrix有地方有問題..
10/24 23:49, 9F

10/25 00:10, , 10F
我覺得你可以先去了解一下圖學的概念 再來做這個
10/25 00:10, 10F

10/25 00:10, , 11F
會對你比較有幫助
10/25 00:10, 11F

10/25 00:16, , 12F
10/25 00:16, 12F

10/25 00:16, , 13F
這裡有跟妳一樣的問題 你要不要在檢查一下你C++的矩陣乘法
10/25 00:16, 13F

10/25 00:24, , 14F
順序的部分看看
10/25 00:24, 14F
文章代碼(AID): #1GXN2WVL (GameDesign)