4. glViewport 和 gluOrtho2D

Posted flyinggod

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4. glViewport 和 gluOrtho2D相关的知识,希望对你有一定的参考价值。

定义视口大小:glViewport (GLint x, GLint y, GLsizei width, GLsizei height) ,默认是(0,0,窗口的宽度,窗口的高度), (x, y)是视口左下角在窗口里位置的坐标, (0, 0)是窗口左下角,w、h是视口的宽和高。截图就在这一部分进行显示.

截取图像大小:gluOrtho2D(x_mix, x_max, y_mix, y_max), 用来指定屏幕区域对应的模型坐标范围,我们自己所绘制的图形的坐标必须在这个范围内,不然不能看到自己绘制的图形。在没调用gluOthor2d函数之前,坐标范围是 X:-1 - 1,Y:-1 - 1;调用了这个函数之后坐标范围是 X:x_mix - x_max,Y: y_mix - y_max

#include <gl/glut.h>

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    //画分割线,分成四个视见区
    glViewport(0, 0, 400, 400);
    glBegin(GL_LINES);
    glVertex2f(-1.0, 0);
    glVertex2f(1.0, 0);
    glVertex2f(0.0, -1.0);
    glVertex2f(0.0, 1.0);
    glEnd();

    //定义在左下角的区域
    glColor3f(0.0, 1.0, 0.0);
    glViewport(0, 0, 200, 200);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在右上角的区域
    glColor3f(0.0, 0.0, 1.0);
    glViewport(200, 200, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在左上角的区域
    glColor3f(1.0, 0.0, 0.0);
    glViewport(0, 200, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在右下角
    glColor3f(1.0, 1.0, 1.0);
    glViewport(200, 0, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //定义剪裁面
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
}

int main(int argc, char** argv)
{
    glutInit(&argc, (char**)argv);
    glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("openGL");
    glutDisplayFunc(display);
    init();

    glutMainLoop();//enters the GLUT event processing loop.  
    return 0;
}

显示效果入下

技术图片

 

以上是关于4. glViewport 和 gluOrtho2D的主要内容,如果未能解决你的问题,请参考以下文章

[图形学]Chapter 8.4 OpenGL 二维观察函数——视口

归一化

OpenGL:使用 FBO 和视口偏移问题渲染到纹理

glViewport 大小不变

在 OpenGL 中使用 glviewport()

使用 OpenGL,如何正确使用 gluOrtho2D 和默认投影?