1. 程式人生 > >OpenGL多視口變換函式:glViewport使用

OpenGL多視口變換函式:glViewport使用

//計算gluLookAt矩陣  
#pragma once
#include <windows.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
#include <atlimage.h>
#include <math.h>
//不顯示控制檯視窗  
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  

float g_RotAngle = 0.5;

void TimerFunction(int value)
{
	g_RotAngle += 1.0;
	if (g_RotAngle>=360)
	{
		g_RotAngle = 0;
	}
	glutPostRedisplay();
	glutTimerFunc(10, TimerFunction, 1);
}
void display()
{
	//glMatrixMode( GL_MODELVIEW );
	//glLoadIdentity();
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 0.0, 0.0);
	//畫分割線,分成四個視見區
	glViewport(0, 0, 800, 600);
	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, 400, 300);
	glPushMatrix();
	glRotatef(g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();

	//定義在右上角的區域
	glColor3f(0.0, 0.0, 1.0);
	glViewport(400, 300, 400, 300);//一定要注意,後面這兩個引數是高度和寬度,而不是座標
	glPushMatrix();
	glRotatef(-g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	//定義在左上角的區域
	glColor3f(1.0, 0.0, 1.0);
	glViewport(0, 300, 400, 300);//一定要注意,後面這兩個引數是高度和寬度,而不是座標
	glPushMatrix();
	glRotatef(-2*g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	//定義在右下角
	glColor3f(1.0, 1.0, 0.0);
	glViewport(400, 0, 400,300);//一定要注意,後面這兩個引數是高度和寬度,而不是座標
	glPushMatrix();
	glRotatef(-3*g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	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);
	//glViewport( 0, 0, 200, 200 ); //放在這裡不好使
}
int main(int argc, char ** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(800, 600);
	glutCreateWindow("OpenGL多視口程式設計");
	glutDisplayFunc(display);
	init();
	glutTimerFunc(1, TimerFunction, 1);
	glutMainLoop();
}
4.截圖效果:

相關推薦

OpenGL變換函式glViewport使用

//計算gluLookAt矩陣 #pragma once #include <windows.h> #define GLUT_DISABLE_ATEXIT_HACK #include <gl/glut.h> #include <atlimage.h> #include

OpenGL變換的矩陣求解

渲染過程中座標系的變換 裁剪在投影時進行,透視投影的裁剪區域為稜錐,正交投影的裁剪區域為長方體。 標準座標系可以直接進行視口變換,將x,y變換到0-w,0-h,z變換到0-1。 頂點幾何變換包含:模型檢視變換,投影變換,視口變換。 注意: 在程式中視口的位

OpenGL學習腳印: 投影矩陣和變換矩陣(math-projection and viewport matrix)

寫在前面 前面幾節分別介紹了模型變換,視變換,本節繼續學習OpenGL座標變換過程中的投影變換。這裡主要是從數學角度推導投影矩陣。對數學不感興趣的,可以稍微瞭解下,或者跳過本節內容。 ,這裡對他的推導思路稍微進行了整理。 通過本節可以瞭解到 透

OpenGl學習筆記3之模型變換、檢視變換、投影變換變換介紹

模型變換、檢視變換、投影變換、視口變換介紹 opengl中存在四種變換,分別是模型變換,檢視變換,投影變換,視口變換。這四種變換是圖形渲染的基本操作,實質上這四種變換都是由矩陣乘法表示(這些操作都是由一個4*4的矩陣來完成的),通過變換,我們可以看到各種通的顯示效果,最簡單

基於 DirectX11 的 MMDViewer 04-渲染目標圖和

ice element play strip() ifdef https warp output for   這篇文章主要介紹渲染管線輸出部分的內容:交換鏈和渲染目標對象,並且介紹多視口渲染方法。   交換鏈:   要創建交換鏈,必須先設置交換鏈描述。交換鏈描述定義

Qt座標變換原理之視窗/變換原理

Qt座標變換原理之視窗/視口變換原理 若對C++語法不熟悉,建議參閱《C++語法詳解》一書,電子工業出版社出版,該書語法示例短小精悍,對查閱C++知識點相當方便,並對語法原理進行了透徹、深入詳細的講解。 需要用到的QPainter類中的函式如下 1)、QTransform combi

DirectX變換矩陣詳解

視口變換在投影變換之後,視口變換的作用是將投影平面上的點轉換為螢幕上的點,這是一個縮放的過程。 投影變換的作用是將viewing frustum(視景體)中的場景投影到一個平面上,這個平面就是投影平面,在DirectX中,使用近剪裁平面作為投影平面(z=1),關於透視投影的

[圖形學]Chapter 8.4 OpenGL 二維觀察函數——

子窗口 觀察 log hide lines logs window gles chap 這節有幾個顯示窗口的控制函數,可以調整視口,創建子窗口,最小化為圖標,設置圖標名稱,隱藏顯示等。 gluOrtho2D (xwmin, xwmax, ywmin, ywmax); //

ECCV 2018 | 曠科技提出GridFace通過學習區域性單應變換實現人臉校正

全球計算機視覺三大頂會之一 ECCV 2018(European Conference on Computer Vision)即將於 9 月 8 -14 日在德國慕尼黑拉開帷幕,曠視科技有多篇論文被此大會接收。在這篇論文中,曠視科技提出的一種通過學習區域性單應變換實現人臉校正的全新方法——GridFac

Linux 工程式設計——程序替換exec 函式

在 Windows 平臺下,我們可以通過雙擊執行可執行程式,讓這個可執行程式成為一個程序;而在 Linux 平臺,我們可以通過 ./ 執行,讓一個可執行程式成為一個程序。 但是,如果我們本來就執行著一個程式(程序),我們如何在這個程序內部啟動一個外部程式,由核心將這個外部程式讀入記憶體

岡薩雷斯數字影象處理(三)第三章灰度變換與空間濾波(1)——基本灰度變換函式

一、前言 空間域指影象平面本身。這類影象處理方法直接以影象中的畫素操作為基礎。這是相對於變換域中的影象處理而言的。變換域的影象處理首先把一幅影象變換到變換域,在變換域中進行處理,然後通過反變換把處理結果返回到空間域 空間域處理主要分為灰度變換和空間濾波兩類。 灰度變換在影象的單個畫素上操

C++ 型的表現形式過載與虛擬函式

多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說:允許將子類型別的指標賦值給父類型別的指標(一個介面,多種方法)。 C++ 支援兩種多型性:編譯時多型性,執行時多型性。 a、編譯

利用IAT匯出OpenGL函式OpenGL Loader的另一種實現辦法

利用這種辦法可以用50KB的DLL匯出OpenGL 3.3版本所有Core Profile函式, DLL比GLEW小很多, 根據glcorearb.h自動生成的程式碼與glLoadGen生成的程式碼差不多, 這部分程式碼包含的函式都是空實現,結合__declspec(dllexport,

OpenCV學習三十五distanceTransform 距離變換函式

1. API 該函式有兩個初始化API C++: void distanceTransform(InputArray src, OutputArray dst, int distanceType,

移動裝置瀏覽器問題(轉載原文http://t.cn/zOZs0Tz)

移動瀏覽器的問題 當我們將移​​動瀏覽器與桌面瀏覽器進行比較時,最明顯的區別是螢幕尺寸。移動瀏覽器顯示的桌面優化網站顯著少於桌面瀏覽器; 通過縮小直到文字不可讀的小,或者只顯示適合螢幕的網站的一小部分。 移動螢幕遠小於桌面螢幕; 考慮最大寬度為400px,有時候要少得多。

錯覺升級版錯覺效果實現

之前發表過一篇關於視錯覺的文章:《》,雖然不是用iOS開發中的Mask來實現的,但是原理和Mask原理是一樣的,相當於手動給上面一層加了個Mask。當然用mask完全可以實現上篇部落格中的效果,無論是使用Mask還是不使用Mask,都是利用了視錯覺,都是兩層不一樣的檢視進行疊加而成的。今天這篇部落格是視錯覺D

從零開始學C++之虛擬函式型(一)虛擬函式表指標、虛解構函式、object slicing與虛擬函式、C++物件模型圖

#include <iostream>using namespace std;class CObject {public:     virtual void Serialize()     {         cout << "CObject::Serialize ..." <&

C語言維陣列做函式引數

任務程式碼: (1)用多維陣列名做函式引數: #include <stdio.h> int max_value(int array[][4]); int main( ) { i

座標系、變換及緩衝區及操作矩陣的通用變換函式openGL

之前一直糾結於座標系與變換呼叫的順序,但到目前為止: a.使用到的只是一個全域性座標和繪圖座標 b.會呼叫變換就行,無關順序 0.物件的點在出現在螢幕的過程中:各種變換呼叫順序和各種座標系出現順序 物件 \ 建模座標系下,轉化到標準的世界座標系下(方便轉換到眼(視

MFC DLL 的初始化入函式

#pragma once #ifndef __AFXWIN_H__ #error "include 'stdafx.h' before including this file for PCH" #endif #include "resource.h"  // main sy