OpenGL編程之窗口 視口 裁剪區

  • 首先解釋下圖形學中的屏幕,窗口,視見區(視口),裁剪區。html

    屏幕:即計算機的整個屏幕大小。函數

    窗口:即屏幕中的某一個窗口,可放大放小和移動關閉。oop

    視口:即在窗口中能夠見到或能夠用來繪圖的部分。通常設置視口等於窗口。spa

    裁剪區:即在視口中讓你看到的圖形,即顯示出來的那部分。.net

     

    GLUT的窗口初始化是在main函數中使用code


    view sourceprint?htm

    1.//初始化窗口位置get

    2.//x:距屏幕左邊的像素大小回調函數

    3.//y:距屏幕頂部的像素大小it

    4.extern void APIENTRY glutInitWindowPosition(int x, int y);

    5.//初始化窗口的寬度和高度

    6.//width:寬度大小

    7.//height:高度大小

    8.extern void APIENTRY glutInitWindowSize(int width, int height);

    視口通常是基於已經定義了的窗口的來定義的。

     

    view sourceprint?

    1.//把視口區設置爲窗口大小,相對與窗口而言(而窗口的位置在開始運行是已經定義了)

    2.//因此(0,0,w,h)中的(0,0)是相對於已經定義好的窗口的左下角的位置。

    3.glViewport(0,0,w,h);

    裁剪區的定義:

       通常會保證與窗口的縱橫比是一致的,因此得設置一個變量aspectRatio。


    view sourceprint?

    01.GLfloat aspectRatio;

    02.glMatrixMode(GL_PROJECTION);//切換爲透視投影矩陣

    03.glLoadIdentity();   //將透視投影矩陣轉換爲單位矩陣

    04.//創建裁剪區域(左右底頂近遠)

    05.aspectRatio = (GLfloat)w/(GLfloat)h;  

    06.if(w<=h){        //若是寬度小於高度(aspectRatio < 1)

    07.glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);

    08.else {

    09.glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);

    10.}

    附上一個例子:

     

    view sourceprint?

    01.#include <GL/glut.h>

    02.//繪製場景

    03.void RenderScence(Void)

    04.{

    05.//用當前顏色清除窗口

    06.glClear(GL_COLOR_BUFFER_BIT);

    07.//把繪圖顏色設置爲紅色

    08.glColor3f(1.0f,0.0f,0.0f);

    09.//用當前的顏色繪製一個填充矩形

    10.glRectf(-25.0f,25.0f,25.0f,-25.0f);

    11.//刷新繪圖命令

    12.glFlush();

    13.}

    14.//當窗口改變大小時由GLUT函數庫調用

    15.void ChangeSize(GLsizei w, GLsizei h)

    16.{

    17.GLfloat aspectRatio;

    18.//防止被0所除

    19.if(h == 0){

    20.h = 1;

    21.}

    22.//把視口區設置爲窗口大小,相對與窗口而言(而窗口的位置在開始運行是已經定義了)

    23.//因此(0,0,w,h)中的(0,0)是相對於已經定義好的窗口的左下角的位置。

    24.//glViewport(0,0,w,h); 

    25.glViewport(15,15,w-100,h-100); 

    26.//重置座標系統

    27.glMatrixMode(GL_PROJECTION);            //切換爲透視投影矩陣

    28.glLoadIdentity();                       //將透視投影矩陣轉換爲單位矩陣

    29.//創建裁剪區域(左右底頂近遠)

    30.aspectRatio = (GLfloat)w/(GLfloat)h;

    31.if(w<=h){                                //若是寬度小於高度(aspectRatio < 1)

    32.//glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0);

    33.glOrtho(-30.0, 30.0, -30/aspectRatio, 30.0/aspectRatio, 1.0, -1.0);

    34.else {

    35.//glOrtho(-100.0*aspectRatio, 100.0*aspectRatio,-100.0, 100.0, 1.0, -1.0);

    36.glOrtho(-30.0*aspectRatio, 30.0*aspectRatio,-30.0, 30.0, 1.0, -1.0);

    37.}

    38.glMatrixMode(GL_MODELVIEW);             //切換爲平行投影矩陣

    39.glLoadIdentity();                       //將平行投影矩陣轉換爲單位矩陣

    40.}

    41.//設置渲染狀態

    42.void SetupRC(void)

    43.{

    44.//設置清除顏色

    45.glClearColor(0.0f, 0.6f, 1.0f, 1.0f);

    46.}

    47.//主程序入口

    48.int main(int argc, char* argv[])

    49.{

    50.glutInit(&argc,argv);

    51.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    52.glutInitWindowPosition(100,300);

    53.glutInitWindowSize(400,400);

    54.glutCreateWindow("coder");                  //建立一個窗口

    55.glutDisplayFunc(RenderScence);                  //註冊回調函數

    56.glutReshapeFunc(ChangeSize);

    57.SetupRC();                                      //設置初始化狀態(有些狀態只須要設置一次)

    58.glutMainLoop();                                 //開始循環運行,顯示繪圖。

    59.return 0;

    60.}

相關文章
相關標籤/搜索