11
A
回答
16
OpenGL使用几个矩阵来转换几何和相关数据。这些矩阵是:
- 模型变换 - 地点在全局对象的几何形状,未投影空间
- 投影 - 项目整体坐标到剪辑空间;你可以把它看成是一种镜头
- 纹理 - 调整之前的纹理坐标;主要用于实现纹理投影(即投影纹理,就好像它是投影机中的幻灯片一样)
- 颜色 - 调整顶点颜色。很少触及所有这些矩阵
所有这些矩阵一直在使用。由于他们都遵循相同的规则的OpenGL只有一组矩阵操作函数:glPushMatrix
,glPopMatrix
,glLoadIdentity
,glLoadMatrix
,glMultMatrix
,glTranslate
,glRotate
,glScale
,glOrtho
,glFrustum
。
glMatrixMode
选择这些操作对哪个矩阵起作用。假设你想写一些C++命名空间的包装,它看起来是这样的:
namespace OpenGL {
// A single template class for easy OpenGL matrix mode association
template<GLenum mat> class Matrix
{
public:
void LoadIdentity() const
{ glMatrixMode(mat); glLoadIdentity(); }
void Translate(GLfloat x, GLfloat y, GLfloat z) const
{ glMatrixMode(mat); glTranslatef(x,y,z); }
void Translate(GLdouble x, GLdouble y, GLdouble z) const
{ glMatrixMode(mat); glTranslated(x,y,z); }
void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) const
{ glMatrixMode(mat); glRotatef(angle, x, y, z); }
void Rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) const
{ glMatrixMode(mat); glRotated(angle, x, y, z); }
// And all the other matrix manipulation functions
// using overloading to select proper OpenGL variant depending on
// function parameters, and all the other C++ whiz.
// ...
};
//
const Matrix<GL_MODELVIEW> Modelview;
const Matrix<GL_PROJECTION> Projection;
const Matrix<GL_TEXTURE> Texture;
const Matrix<GL_COLOR> Color;
}
后来在一个C++程序,你可以写,然后
void draw_something()
{
OpenGL::Projection::LoadIdentity();
OpenGL::Projection::Frustum(...);
OpenGL::Modelview::LoadIdentity();
OpenGL::Modelview::Translate(...);
// drawing commands
}
不幸的是C++无法模板命名空间,或应用using
(或with
)的情况下,(其它语言有这个),否则我写了类似的信息(无效C++)
void draw_something_else()
{
using namespace OpenGL;
with(Projection) { // glMatrixMode(GL_PROJECTION);
LoadIdentity(); // glLoadIdentity();
Frustum(...); // glFrustum(...);
}
with(Modelview) { // glMatrixMode(GL_MODELVIEW);
LoadIdentity(); // glLoadIdentity();
Translate(...); // glTranslatef(...);
}
}
我认为日是最后剪去的(伪)代码清楚地表明:glMatrixMode
是OpenGL的一个with
语句。
0
你可以找到你的答案在这里http://www.opengl.org/sdk/docs/man/xhtml/glMatrixMode.xml
模型视图是建模。投影是为了投射像3D的东西。纹理的纹理。着色的颜色。但还有更多。请阅读我给你的链接。干杯。
1
所有的都由OpenGL内部使用,但是否需要更改它们取决于您的应用程序。
您将始终需要设置投影矩阵来确定您的视野和您正在查看的空间范围。通常你会设置模型视图矩阵来选择你的“相机”方向,并在场景中定位对象。
纹理和颜色矩阵不太常用。在我当前的项目中,我使用Texture矩阵来翻转位图中的Y.我从未使用过Color矩阵。
3
作为旁注,矩阵模式(以及矩阵堆栈功能的其余部分)在OpenGL 3.3及更高版本中不推荐使用。
相关问题
- 1. 什么是OpenGL RBO?
- 2. OpenGL glTexImage2D是做什么的?
- 3. OpenGL中glTexParameter的范围是什么?
- 4. 什么是android opengl相当于surfaceHolder.lockCanvas()
- 5. 什么是OpenGL中的常态?
- 6. 什么是OpenGL纹理ID的范围?
- 7. 什么是OpenGL中的查询对象?
- 8. Opengl - 为什么normalize()不是幂等的?
- 9. 什么是OpenGL次要颜色有用?
- 10. OpenGL:弃用的处理是什么?
- 11. 什么是openGL中的顺时针脸
- 12. Android中的OpenGL。什么是配置?
- 13. 什么是标准的OpenGL工具包?
- 14. OpenGL(iPhone)中的GLKMatrix4是什么?
- 15. OpenGL ES中的'glBufferData'是什么?
- 16. 什么是最好的OpenGL java绑定?
- 17. 什么是未扩展的OpenGL?
- 18. canvas vs openGL的功能是什么?
- 19. OpenGL-ES的“进”和“出”是什么? (从OpenGL移植)
- 20. opengl发生了什么?现在是什么样的噩梦?
- 21. OpenGL vs OpenGL ES和OpenGL 1.x vs OpenGL 2.0要学什么?
- 22. D3D输入插槽究竟是什么,以及OpenGL的等价物是什么?
- 23. OpenGL vs Cocos2d:选择什么?
- 24. OpenGL - 在OpenGL中绘制椭圆的最有效方法是什么?
- 25. 什么是OpenGL中的阴影采样器,它们有什么用途?
- 26. 什么是OpenGL 2D视图的最小样板代码?
- 27. 什么是在Win32中更新场景的正确方法OpenGL
- 28. iPhone OpenGL ES:什么是最快的纹理模式?
- 29. opengl中光计算所属的空间是什么?上周
- 30. 什么是OpenGL上下文中的逻辑缓冲区?