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); } } }
我驰骋天下,守你盛世繁华