OpenGL矩阵转置测试——禁止转载
来源:互联网 发布:glassfish linux安装 编辑:程序博客网 时间:2024/06/09 03:50
一直没有找到很好的解释,或者解释复杂简短,还是自己动手测试一下,测试步骤如下:
1.输入glTranslatef(0.1,0.1,0.0);
得到的GL_MODELVIEW_MATRIX的值为:
说明变换矩阵变换的是12,13,14,15这几个变量,问题又产生了,12,13,14,15又是最后一行还是最后一列呢?
2.输入
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat mat[] = {//检验矩阵的存储形式,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
glMultMatrixf(mat);
GLfloat Test[16];
glGetFloatv(GL_MODELVIEW_MATRIX,Test);
得到如下结果图:
说明在内存当中还是按行存储的。要不然Test【3】== 0.0,
改动代码如下:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.1,0.1,0.0);
GLfloat mat[] = {//检验矩阵的存储形式,
1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
};
glMultMatrixf(mat);
GLfloat Test[16];
glGetFloatv(GL_MODELVIEW_MATRIX,Test);
这里就出问题了:
假如按前两部的内存进行相乘,我们可以计算得到的矩阵应该是:T * mat = C
1 0 0 0 1 0 0 1 1 0 0 1
0 1 0 0 * 0 1 0 0 = 0 1 0 0
0 0 1 0 0 0 1 0 0 0 1 0
0.1 0.1 0 1 0 0 0 1 0.1 0.1 0 1.1
我们发现差距如此之大??怎样才能得到内存中的结果呢?
研究发现,要使得,Test【0】=1.1,唯一的方法是 T的转置 * mat的转置 = Test的转置
所以最后内存中存的结果也是经过OpenGL内部转置而成的。
经过以上总结,OpenGL的列存储真是瞎鸡巴扯,搞死神仙,你载入的矩阵在内存还是按行存储的,它所谓的列存储是当你载入矩阵时,会在相乘的时候自动解析为按列扫描,这样两个矩阵相乘时就会变为 A的第一列 * B的第一行 = 第一个元素,A的第二列 * B的第第一行 =第二个元素(注意,我说的是内存当中的第一个第二个元素,一次类推)
为了避免过长让你灰心,先冷静一下,想明白一下,下一节讨论一下如何矩阵转换。
- OpenGL矩阵转置测试——禁止转载
- OpenGL关于gl_object_plane和gl_eye_plane的一些遐想————禁止转载
- OpenGL矩阵推导——模型视图变化(转载需写明作者)
- OpenGL关于纹理坐标s、t、r、q的遐想之一————禁止转载
- 转载——配置OpenGL
- OpenGL学习三——矩阵堆栈
- Opengl——深度测试
- OpenGL关于转换的一些遐想--------禁止转载
- 转载——OpenGL入门学习
- [转载]android—OpenGL—GL10方法解析(转载)
- OpenGL入门学习——第十二课,OpenGL片断测试
- OpenGL入门学习——第十二课 OpenGL片断测试
- OpenGL入门学习之十二——OpenGL片断测试
- openGL正交矩阵转屏幕矩阵
- 深入了解OpenGL——模板测试
- 深入了解OpenGL——模板测试
- Opengl学习之——模板测试
- OpenGL基本概念入门3——矩阵变换
- oracle和sqlserver查询时阻塞情况
- 网站
- 浅析ldd命令
- 项目需求分析难在哪里?
- 谨防php包含文件的相对路径问题导致的crontab无法正常运行
- OpenGL矩阵转置测试——禁止转载
- Apache性能测试工具Apache Bench
- 基于jersey 的资料,值得一看
- 虞美人
- Blue Tooth
- asio socket::close时异步操作的处理
- API设计小手册
- 除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。
- 小虎安家记