OpenGL技术之View Volume, Viewport, Screen的关系
生活随笔
收集整理的這篇文章主要介紹了
OpenGL技术之View Volume, Viewport, Screen的关系
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:i_dovelemon
日期:2016 / 03 / 08
來源:CSDN
主題:OpenGL,View Volume,Viewport,Screen
引言
今天在公司的時(shí)候,基本工作做完之后,趁著一點(diǎn)多余的時(shí)間,回顧了下以前學(xué)習(xí)的OpenGL的知識(shí)。在看到第一章節(jié)的時(shí)候,書中使用一個(gè)正交窗口,顯示一些很簡(jiǎn)單的圖形。本來單單就這么一個(gè)實(shí)例的話,是很容易實(shí)現(xiàn)的。但是我一直以來都沒有太搞清楚,OpenGL中各種指令到底做了些什么工作。所以,帶著這樣的疑問,我主要探究了下OpenGL中三個(gè)比較重要的概念,View Volume,Viewport以及Screen的關(guān)系。
概念介紹
View Volume
View Volume,有時(shí)候叫做View Frustum,也就是視景體。這個(gè)東西是定義了我們能夠通過虛擬的3D攝像機(jī)所能看到的場(chǎng)景。當(dāng)我們?cè)谝粋€(gè)3D場(chǎng)景中站立的時(shí)候,除了我們的位置之外,同樣需要視野來定義我們所能夠看到的東西。而這個(gè)視野就是通過視景體來定義的。一般在3D中,我們有兩種不同的方式定義視景體。他們的形狀分別如下所示:
圖1
圖2
上面給出了兩個(gè)不同的視景體,圖1表示的是中心透視視景體,而圖2表示的是正交投影視景體。這兩個(gè)幾何體都全面的定義了我們所能夠看到的視野,在OpenGL中也分別有不同的指令對(duì)應(yīng)與這兩個(gè)幾何體。
我們都知道,在3D圖形學(xué)中,我們是通過定義投影矩陣的方式來描述視景體的。通過定義中心透視矩陣來描述中心透視視景體,通過定義正交矩陣的方式來定義正交視景體。
Viewport
Viewport,中文翻譯為視口。它的定義具有兩個(gè)意義。一個(gè)意義是它定義了上面定義的視景體中的景物將會(huì)繪制到一張什么尺寸的畫布之上,另外一個(gè)意義表示這個(gè)繪制好的圖像將會(huì)被顯示在屏幕的什么區(qū)域。
很明顯,如果我們定義的視景體的投影平面的寬高比和視口所定義的寬高比不相同的話,那么將視景體中的物體繪制到畫布上的時(shí)候會(huì)進(jìn)行拉伸或者壓縮;而當(dāng)視景體投影平面的寬高比和視口所定義的寬高比一致的時(shí)候,圖像將會(huì)不進(jìn)行任何縮放繪制到視口所定義的畫布之上。
視口定義中還包含了這個(gè)視口所表示的圖像將會(huì)被繪制到屏幕的哪塊區(qū)域之上的信息。在很多的圖形應(yīng)用中,我們都會(huì)發(fā)現(xiàn)在一個(gè)窗口中繪制多個(gè)3D場(chǎng)景的情況。而這個(gè)技術(shù)就是通過定義多個(gè)視口,繪制多個(gè)圖像,然后“貼在”一個(gè)比較大的屏幕的多個(gè)不同的區(qū)域。
Screen
Screen即屏幕的意思,在真實(shí)世界中,我們都是通過屏幕上的東西來觀察3D世界的。所有的場(chǎng)景最終都要被光柵化成為我們顯示器上的圖像。也就是說屏幕是3D場(chǎng)景的最終輸出目的地。一個(gè)Screen可以容納顯示多個(gè)視口中的內(nèi)容。
三者的關(guān)系
通過前面的介紹,我們大致的了解了這三個(gè)不同東西的概念。從中我們可以知道,通過定義投影矩陣,我們實(shí)際上是在虛擬的3D空間中,創(chuàng)建了一個(gè)視野,也就是視景體。在接著,我們通過定義視口,來描述視景體中的內(nèi)容如何映射到一個(gè)虛擬的畫布之上,并且這個(gè)畫布最終將顯示在屏幕上的什么位置。當(dāng)所有的這些都設(shè)置完畢,我們繪制完畢場(chǎng)景之后,就能夠通過硬件在我們的顯示器屏幕上看到最終的畫面。更理論的表述就是,通過定義投影矩陣,將3D場(chǎng)景投影到一個(gè)投影平面之上。通過定義視口,我們將投影平面上的內(nèi)容映射到這個(gè)視口中去,并且填滿它,同時(shí)根據(jù)定義視口是給定的屏幕坐標(biāo)的位置,將這個(gè)視口中的圖像映射到窗口的指定位置之上,最終我們就看到了圖像。
代碼演示
為了演示前面所講述的內(nèi)容,簡(jiǎn)單的做了一個(gè)Demo,它將在一個(gè)屏幕上繪制4個(gè)不同視口里面的畫面,代碼如下所示:
#ifndef GLUT_DISABLE_ATEXIT_HACK #define GLUT_DISABLE_ATEXIT_HACK #endif#include <GL\glut.h> #include <GL\GL.h> #include <stdio.h>void oglDisplay();int main() {glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);glutInitWindowSize(400,400);glutCreateWindow("Viewport");glutDisplayFunc(oglDisplay);glClearColor(0.1f, 0.1f, 0.1f, 1.0f);glutMainLoop();return 0; }void oglDisplay() {glClear(GL_COLOR_BUFFER_BIT);// Left-BottomglViewport(0,0, 200, 200);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-100.0f, 100.0f, -100.0f, 100.0f, 100.0f, -100.0f);glColor3f(1.0f, 0.0f, 0.0f);glRectf(-100.0f, 100.0f, 100.0f, -100.0f);// Right-BottomglViewport(200, 0, 200, 200);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-100.0f, 100.0f, -100.0f, 100.0f, 100.0f, -100.0f);glColor3f(0.0f, 1.0f, 0.0f);glRectf(-100.0f, 100.0f, 100.0f, -100.0f);// Left-TopglViewport(0, 200, 200, 200);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-100.0f, 100.0f, -100.0f, 100.0f, 100.0f, -100.0f);glColor3f(0.0f, 0.0f, 1.0f);glRectf(-100.0f, 100.0f, 100.0f, -100.0f);// Right-TopglViewport(200, 200, 200, 200);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-100.0f, 100.0f, -100.0f, 100.0f, 100.0f, -100.0f);glColor3f(1.0f, 1.0f, 0.0f);glRectf(-100.0f, 100.0f, 100.0f, -100.0f);glFlush(); }
? ? ? ? 運(yùn)行結(jié)果如下所示:
總結(jié)
以上是生活随笔為你收集整理的OpenGL技术之View Volume, Viewport, Screen的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: locale到底是个什么玩意
- 下一篇: 安徽省计算机二级考试vfp试题,安徽省计