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);
        }

    }
}
原文地址:https://www.cnblogs.com/lotuses/p/11357948.html