SharpGL之Viewport
视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是将经过几何变换, 投影变换和裁剪变换后的物体显示于屏幕指定区域内.
前面我们讨论过的透视投影, 正射投影, 它们都会产生一个视景体, 利用Viewport()函数, 就可以把这些视景体内投影的物体显示到屏幕指定的区域内.
默认情况下, 视口就是你用来绘制3D图像的整个矩形区域.
Viewport的原型是: Viewport(int x, int y, int width, int height)
我们来用示意图描述一下这个函数的作用:
(1) Viewport定义了视口在窗口中的区域, 同时也规定了二维像素平面到视口区域的映射关系.
(2) 若有Viewport(0,0,w/2,h)则会有下面的效果:
(3) 也可以利用Viewport()生成多窗口效果:
Viewport(0,0, w/2, h/2); drawpic(); //左下角
Viewport(w/2,0, w/2, h/2); drawpic(); //右下角
Viewport(0, h/2, w/2, h/2); drawpic(); //左上角
Viewport(w/2, h/2, w/2, h/2); drawpic(); //右上角
下面给出多窗口效果例子的源码:

- 1 using System;
- 2 using System.Collections.Generic;
- 3 using System.ComponentModel;
- 4 using System.Data;
- 5 using System.Drawing;
- 6 using System.Linq;
- 7 using System.Text;
- 8 using System.Windows.Forms;
- 9 using SharpGL;
- 10
- 11 namespace SharpGLWinformsApplication1
- 12 {
- 13 public partial class SharpGLForm : Form
- 14 {
- 15 public SharpGLForm()
- 16 {
- 17 InitializeComponent();
- 18 }
- 19
- 20 private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
- 21 {
- 22 OpenGL gl = openGLControl.OpenGL;
- 23 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
- 24 gl.LoadIdentity();
- 25 display(gl);
- 26 }
- 27
- 28 void display(OpenGL gl)
- 29 {
- 30 gl.Color(1.0, 0.0, 0.0);
- 31 //画分割线,分成四个视见区
- 32 gl.Viewport(0, 0, 400, 400);
- 33 gl.Begin(OpenGL.GL_LINES);
- 34 {
- 35 gl.Vertex(-1.0, 0);
- 36 gl.Vertex(1.0, 0);
- 37 gl.Vertex(0.0, -1.0);
- 38 gl.Vertex(0.0, 1.0);
- 39 }
- 40 gl.End();
- 41 42
- 43 //定义在左下角的区域
- 44 gl.Color(0.0, 1.0, 0.0);
- 45 gl.Viewport(0, 0, 200, 200);
- 46 gl.Begin(OpenGL.GL_POLYGON);
- 47 {
- 48 gl.Vertex(-0.5, -0.5);
- 49 gl.Vertex(-0.5, 0.5);
- 50 gl.Vertex(0.5, 0.5);
- 51 gl.Vertex(0.5, -0.5);
- 52 }
- 53 gl.End();
- 54
- 55 //定义在右上角的区域
- 56 gl.Color(0.0, 0.0, 1.0);
- 57 gl.Viewport(200, 200, 200, 200);
- 58 gl.Begin(OpenGL.GL_POLYGON);
- 59 {
- 60 gl.Vertex(-0.5, -0.5);
- 61 gl.Vertex(-0.5, 0.5);
- 62 gl.Vertex(0.5, 0.5);
- 63 gl.Vertex(0.5, -0.5);
- 64 }
- 65 gl.End();
- 66
- 67 //定义在左上角的区域
- 68 gl.Color(1.0, 0.0, 0.0);
- 69 gl.Viewport(0, 200, 200, 200);
- 70 gl.Begin(OpenGL.GL_POLYGON);
- 71 {
- 72 gl.Vertex(-0.5, -0.5);
- 73 gl.Vertex(-0.5, 0.5);
- 74 gl.Vertex(0.5, 0.5);
- 75 gl.Vertex(0.5, -0.5);
- 76 }
- 77 gl.End();
- 78
- 79 //定义在右下角
- 80 gl.Color(1.0, 1.0, 1.0);
- 81 gl.Viewport(200, 0, 200, 200);
- 82 gl.Begin(OpenGL.GL_POLYGON);
- 83 {
- 84 gl.Vertex(-0.5, -0.5);
- 85 gl.Vertex(-0.5, 0.5);
- 86 gl.Vertex(0.5, 0.5);
- 87 gl.Vertex(0.5, -0.5);
- 88 }
- 89 gl.End();
- 90
- 91 gl.Flush();
- 92 }
- 93
- 94 private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
- 95 {
- 96 OpenGL gl = openGLControl.OpenGL;
- 97 gl.ClearColor(0, 0, 0, 0);
- 98 }
- 99
- 100
- 101 private void openGLControl_Resized(object sender, EventArgs e)
- 102 {
- 103 OpenGL gl = openGLControl.OpenGL;
- 104 gl.MatrixMode(OpenGL.GL_PROJECTION);
- 105 gl.LoadIdentity();
- 106
- 107 gl.Ortho2D(-1.0, 1.0, -1.0, 1.0);
- 108 gl.MatrixMode(OpenGL.GL_MODELVIEW);
- 109 }
- 110 }
- 111 }

效果如下图:
SharpGL之Viewport的更多相关文章
- SharpGL学习笔记(七) OpenGL的变换总结
笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...
- SharpGL学习笔记(五) 视口变换
视口变换主是将视景体内投影的物体显示到二维的视口平面上. 在计算机图形学中,它的定义是将经过几何变换, 投影变换和裁剪变换后的物体显示于屏幕指定区域内. 前面我们讨论过的透视投影, 正射投影, 它们都 ...
- CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...
- 移动WEB开发之viewport
问题: 在codepen上写了一个响应式页面,调试的时候没有问题.结果放到网站上,在手机上打开之后竟然和在电脑中的布局是一样的. 查阅资料之后知道响应式布局应该有这样一句话:<m ...
- viewport理解
viewport预备知识 dpr === dppx dpr:device pixel ratio 设备像素比 dppx:Number of dots per px unit 每像素有多少点 . 1dp ...
- 移动WEB viewport 相关知识
了解移动web viewport的知识,主要是为了切图时心中有数.本文主要围绕一个问题:切图时怎样设置<meta name="viewport">相关参数?围绕这个问题 ...
- 理解SVG的viewport,viewBox,preserveAspectRatio
万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...
- 移动端开发viewport深入理解(转)
一.viewport的概念 移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,就是浏览器上用来显示网页的那部分区域,但viewport不局限于浏览器可视区域 的大小,它 ...
- 移动前端开发之viewport的深入理解
在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...
随机推荐
- Mybatis书写
Mybatis设置主键和自增 方法1: <insert id="insert" parameterType="Person" useGeneratedKe ...
- 记录TortoiseGit=>https请求/ssh请求配置
ssh C:\Program Files\Git\usr\bin\ssh.exe https C:\Program Files\TortoiseGit\bin\TortoisePlink.exe
- Mysql—索引原理与详解
索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...
- Linux文件传输协议2019-7-9
FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...
- 【BZOJ2655】calc(拉格朗日插值)
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
- 如何对jmeter设置IP欺骗
由于服务器出于安全考虑会对同一IP地址做过滤,所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址.主要步骤分为以下3步:第一步:在负载机上绑定IP地址. 第二步:在要欺骗的http ...
- IntelliJ IDEA 快捷键(七)
/*方法参数提示*/ ctrl + p /*折叠代码/展开代码*/ ctrl + - / ctrl + + /*快速查找和打开最近使用过的文件*/ ctrl + E /*自动代码片*/ ctrl + ...
- leetcode279. 完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12输出: 3 解释: 12 = ...
- oracle存储过程中循环游标,变量的引用
创建出错时使用: show errors查看具体的错误提示 一. 存储过程中的一个循环及变量引用示例: create or replace procedure my_proiscursor cur i ...
- maven 常见命令
mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个阶段.mvn clean ...