gluOrtho2D 函数设置二维正交裁剪区域。 相当于调用 zNear = -1 且 zFar = 1 的 glOrtho 。
glOrtho定义二维正交投影矩阵,这个矩阵会把视图(摄像机)空间的坐标转换到一个裁剪空间,一言以蔽之:glOrtho定义了裁剪空间(Clip Space)
void WINAPI glOrtho(
GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble zNear,
GLdouble zFar
);
参数
left, right 指定可视空间的左边界和右边界
bottom, top 指定可视空间的下边界和上边界
zNear:距离较近的深度剪裁平面。
zFar:到更远深度剪裁平面的距离。
正交投影的裁剪空间如图:
我们写gl代码时候,glOrtho是用来指定屏幕绘制区域的逻辑坐标范围的,调用glOrtho后,我们代码中要传给着色器的顶点坐标值,就不再是规范化了的取值范围,不再是-1~1;而是我们自定义的一个范围, 我们自己所绘制的图形的坐标必须设置在这个范围内,不然不能看到自己绘制的图形。
如果想把逻辑坐标范围变成规范化坐标(-1~1)只需要这样调用:
glOrtho(-1,1,-1,1,-1,1); 这样调用所产生的坐标系为:原点在中间 x:[-1,1],y:[-1,1]。
看来glOrtho同时也定义了原点(0,0)的方位。
- 例1我们这样调:glOrtho(0,100,0,100,-100,100);那么我们的坐标空间范围是:
x:[0,100](x取0在最左边,x取100在最右边)
y:[0,100](y为0在最下方bottom,y为100在最上方top)
因此得到原点在左下角
- 例2 glOrtho(100,0,100,0,-100,100);坐标空间范围是:
x:[0,100](100最左边,0最右边)
y:[0,100](100在最下方,0在最上方)
因此得到原点在右上角
- 例3 glOrtho(-100,100,-100,100,-100,100);坐标空间范围是:
x:[-100,100](-100最左边,100最右边)
y:[-100,100](-100在最下方,100在最上方)
因此得到原点在中心点
代码案例:
void render()
{
//! 指定以下的操作针对投影矩阵
glMatrixMode(GL_PROJECTION);
//! 将投影举证清空成单位矩阵
glLoadIdentity();
int WIDTH = 500;
int HEIGHT = 500;
glViewport(0, 0, WIDTH, HEIGHT);
glOrtho(0,500, 500,0,-100,100);//左上角为原点
//以0-500为坐标范围,画我们的坐标系空间矩形
Vertex viewRect[] =
{
{0, 0, 0, 0.5, 0.5, 0.5},
{WIDTH, 0, 0, 0.5, 0.5, 0.5},
{0, HEIGHT, 0, 0.5, 0.5, 0.5},
{WIDTH, HEIGHT, 0, 0.5, 0.5, 0.5},
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), viewRect);
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &viewRect[0].r);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//以0-500为坐标范围 画三角形
Vertex vertex[] =
{
{10, 10, 0, 1, 0, 0},//红色顶点 //左上角
{490, 10, 0, 0, 1, 0},//绿色顶点 //右上角
{250, 250, 0, 0, 0, 1},//蓝色顶点 //中心点
};
glColor3f(1,0,1);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3,GL_FLOAT,sizeof(Vertex), vertex);
glColorPointer(3,GL_FLOAT,sizeof(Vertex),&vertex[0].r);
glDrawArrays(GL_LINE_LOOP,0,3);
glLoadIdentity();
//以-1-1为坐标范围 画三角形
glOrtho(-1,1, -1, 1, -100, 100);//中心为原点
Vertex vertex1[] =
{
{-0.9, -0.9, 0, 1, 0, 0},//红色顶点 //左下角
{0.9, -0.9, 0, 0, 1, 0},//绿色顶点 //右下角
{0, 0, 0, 0, 0, 1},//蓝色顶点 中心点
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), vertex1);
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertex1[0].r);
glDrawArrays(GL_LINE_LOOP, 0, 3);
}
运行效果:灰色区域是我们的坐标范围x和y都是0-500,上面的三角形蓝色顶点坐标是(250,250),下面的三角形蓝色顶点坐标是(0,0),这两个点都在灰色矩形中心点