先上平面文字绘制函数:DrawText(int x, int y, float r, float g, float b, string faceName, float fontSize, string text)
其中:
x,y:是屏幕坐标,及像素坐标;
r,g,b:是RGB颜色,范围:0~1f;
faceName:字体类型;
fontSize:字体大小;
text:绘制的内容;
需要注意的是:DrawText绘制需要用到屏幕像素坐标,在OpenGL中是3维世界坐标,我们绘制的物体通过视图矩阵、投影矩阵、模型矩阵等操作将其映射在2维屏幕上。
所以,若想将text精准的绘制在图形某一位置,就需要知道图形位置映射到屏幕上的坐标,就需要用到project投影函数。
SharpGL中可以用两种方式,两种方式原理上一样,只是SharpGL对其封装了一下,用起来更方便,不需要在重新获取OpenGL的视图矩阵、投影矩阵、模型矩阵。这里我们直接上封装后的方法,原始方法Project有一个对应的UnProject操作,下一节在整理。
在SharpGL命名空间下有一个:SceneGraph命名空间,其主要包括OpenGL对象和场景元素,如:光、材质、纹理、NURBS、着色器等,在该命名空间下有一个扩展类:OpenGLSceneGraphExtensions,这里就封装了投影矩阵以及获取OpenGL当前状态的视图矩阵、投影矩阵、纹理矩阵等方法,这里我们只用投影矩阵:
Vertex SharpGL.SceneGraph.OpenGLSceneGraphExtensions.Project(this OpenGL gl, Vertex vertex)
其中:
vertex:就是OpenGL世界坐标系下的坐标点。
返回值:就是该点对应的屏幕坐标点。
看下效果:绘制一个矩形框,并在四个顶点位置绘制指定坐标值
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
{
OpenGL gl = this.openGLControl1.OpenGL;
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gl.MatrixMode(OpenGL.GL_PROJECTION);
gl.LoadIdentity();
gl.Ortho(-10