zoukankan      html  css  js  c++  java
  • 5、事例五:视口变换(Viewport)

    namespace sharpGLTest05
    {
        public partial class SharpGLForm : Form
        {
            public SharpGLForm()
            {
                InitializeComponent();
            }
    
            private void openGLControl_OpenGLDraw(object sender, RenderEventArgs e)
            {
                OpenGL gl = openGLControl.OpenGL;
                gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
                gl.LoadIdentity();
                display(gl);
            }
    
            void display(OpenGL gl)
            {
                gl.Color(1.0, 0.0, 0.0);
                /*
                 * Viewport()函数,可以将透视投影、正射投影等类似的视景体显示到屏幕指定的区域内
                 * 默认情况下,视口就是你用来绘制3D图像的整个矩形区域 
                 * 1)Viewport定义了视口在窗口中的区域,同时也规定看二维像素平面到视口区域的映射关系
                 * 2)可以利用Viewport()生成多窗口效果
                 *  Viewport(0,0,w/2,h/2);      左下角
                 *  Viewport(w/2,0,w/2,h/2);    右下角
                 *  Viewport(0,h/2,w/2,h/2);    左上角
                 *  Viewport(w/2,h/2,w/2,h/2);  右上角
                 * */
                //画分割线,分成四个视见区
                gl.Viewport(0, 0, 600, 600);
                gl.Begin(OpenGL.GL_LINES);
                {
                    gl.Vertex(-1.0, 0);
                    gl.Vertex(1.0, 0);
                    gl.Vertex(0.0, -1.0);
                    gl.Vertex(0.0, 1.0);
                }
                gl.End();
    
                //定义在左下角的区域
                gl.Color(0.0, 1.0, 0.0);
                gl.Viewport(0, 0, 200, 200);
                gl.Begin(OpenGL.GL_POLYGON);
                {
                    gl.Vertex(-0.5, -0.5);
                    gl.Vertex(-0.5, 0.5);
                    gl.Vertex(0.5, 0.5);
                    gl.Vertex(0.5, -0.5);
                }
                gl.End();
    
                //定义在右上角的区域
                gl.Color(0.0, 0.0, 1.0);
                gl.Viewport(300, 300, 300, 300);
                gl.Begin(OpenGL.GL_POLYGON);
                {
                    gl.Vertex(-0.5, -0.5);
                    gl.Vertex(-0.5, 0.5);
                    gl.Vertex(0.5, 0.5);
                    gl.Vertex(0.5, -0.5);
                }
                gl.End();
    
                //定义在左上角的区域
                gl.Color(1.0, 0.0, 0.0);
                gl.Viewport(0, 300, 300, 200);
                gl.Begin(OpenGL.GL_POLYGON);
                {
                    gl.Vertex(-0.5, -0.5);
                    gl.Vertex(-0.5, 0.5);
                    gl.Vertex(0.5, 0.5);
                    gl.Vertex(0.5, -0.5);
                }
                gl.End();
    
                //定义在右下角
                gl.Color(1.0, 1.0, 1.0);
                gl.Viewport(200, 0, 200, 200);
                gl.Begin(OpenGL.GL_POLYGON);
                {
                    gl.Vertex(-0.5, -0.5);
                    gl.Vertex(-0.5, 0.5);
                    gl.Vertex(0.5, 0.5);
                    gl.Vertex(0.5, -0.5);
                }
                gl.End();
    
                gl.Flush();
            }
    
            private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
            {
                OpenGL gl = openGLControl.OpenGL;
                gl.ClearColor(0, 0, 0, 0);
            }
    
            private void openGLControl_Resized(object sender, EventArgs e)
            {
    
                OpenGL gl = openGLControl.OpenGL;
                gl.MatrixMode(OpenGL.GL_PROJECTION);
                gl.LoadIdentity();
                gl.Ortho2D(-1.0, 1.0, -1.0, 1.0);
                gl.MatrixMode(OpenGL.GL_MODELVIEW);
            }
    
        }
    }
  • 相关阅读:
    CCNP-MPLS-标签交换
    Mac地址表、STP与RSTP原理
    mysql 初始数据库简单操作
    异步回调,事件,线程池与协程
    bug问题
    GIL 线程池
    异常处理
    奇怪的东西
    绑定方法
    初体验
  • 原文地址:https://www.cnblogs.com/lotuses/p/11357948.html
Copyright © 2011-2022 走看看