作者jack0820 (我想要P币....Orz)
看板GameDesign
标题[程式] openGL矩阵问题
时间Tue Oct 23 00:13:19 2012
※ [本文转录自 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
1F:推 LPH66:也许是因为 openGL 的矩阵是 column major 的? 10/22 20:00
2F:推 Bencrie:推楼上,我觉得原 po 有可能乘错 XD 10/22 22:43
3F:→ Bencrie:编译环境没有 glu 可以用吗 ? 10/22 22:44
先感谢楼上两位大大回应 @@"
我本来也觉得是不是我矩阵乘错了
但对照一下应该是不会
(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
4F:推 damody:在shader里面算不会比较慢喔 ~~ 10/24 22:39
5F:→ damody:x,y,z范围都必须落在-1~1之间 是对的 10/24 22:40
6F:→ damody:平移没问题是因为投影矩阵帮你投影回 -1~1 之间 10/24 22:40
7F:→ damody:model view 也有缩放 旋转 位移效果 10/24 22:41
8F:推 tsl3333:不是World Matrix的Scale Rot Translate相乘顺序错了 10/24 23:48
9F:→ tsl3333:不然就是View Matrix or Projection Matrix有地方有问题.. 10/24 23:49
10F:→ tsl3333:我觉得你可以先去了解一下图学的概念 再来做这个 10/25 00:10
11F:→ tsl3333:会对你比较有帮助 10/25 00:10
13F:→ tsl3333:这里有跟你一样的问题 你要不要在检查一下你C++的矩阵乘法 10/25 00:16
14F:→ tsl3333:顺序的部分看看 10/25 00:24