OpenGL In C# 03 在OpenGL中使用WPF绘制的字体
来源:互联网 发布:萧山网络问政app 编辑:程序博客网 时间:2024/04/27 22:24
由于FBO或者是DIB方式进行OpenGL绘制性能实在不佳,所以以后的绘制都将采用Native模式。
我把一些常用的Win32函数和OpenGL函数以及常量抄了一遍,做了一个TOpenGL的类库,以后需要用的地方就引用一下就好了,这样就方便多了。
这次增加了一个类,能使用WPF的绘制方法把字符串绘制到内存,再加载到纹理,最后通过OpenGL进行显示,完美支持中文,速度也挺快的。
使用WPF需要添加3个引用: WindowBase、PresentationCore 和 PresentationFrameWork。
使用的主要类有DrawingVisual 用于在屏幕上呈现向量图形
DrawingContext DC的WPF版本
FormattedText 用来获取格式化的字符串
RenderTargetBitmap 用来将字符串绘制到内存中
下面这段代码实现了从OpenGL申请一个纹理号,使用WPF对象将字符串绘制到内存,并将字符串设置为纹理的过程,然后就可以使用这个纹理的纹理号进行显示了。
OpenGL.glGenTextures(1, texture); DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); // Draw a formatted text string into the DrawingContext. byte[] ch = BitConverter.GetBytes(UnCode); string s = ASCIIEncoding.Unicode.GetString(ch); FormattedText formtext = new FormattedText(s, CultureInfo.GetCultureInfo("zh-CHS"), System.Windows.FlowDirection.LeftToRight, new Typeface(FontName), 24, Brushes.White); drawingContext.DrawText(formtext, new System.Windows.Point(0, 0)); // Persist the drawing content. drawingContext.Close(); RenderTargetBitmap rtb = new RenderTargetBitmap(W, H, 96, 96, PixelFormats.Pbgra32); rtb.Render(drawingVisual); data = new byte[4 * W * H]; rtb.CopyPixels(data, 4 * W, 0); OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture[0]); OpenGL.glTexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, W, H, 0, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE, data); OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR); OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR);
经过我的测试这种绘制方式的速度是200,000字/秒,如果一个界面需要显示2000字的话只需10毫秒即可完成绘制,效率还算不错的。
如果朋友们有什么问题可以留言与我讨论,呵呵。
工程下载地址:http://download.csdn.net/detail/tianyu2202/4361599
原创内容,欢迎转载,转载请注明出处:http://blog.csdn.net/tianyu2202/
- OpenGL In C# 03 在OpenGL中使用WPF绘制的字体
- 使用Opengl绘制字体
- 使用Opengl绘制字体
- OpenGL In C# 02 使用FBO的方式绘制OpenGL窗体 并在XP下实现全透明
- OpenGL点阵字体绘制
- 在OpenGL中绘制圆
- OpenGL In C# 01 NativeOpenGL 使用默认窗体绘制OpenGL内容
- 不同字体的绘制【OpenGL】【FreeType】
- 在VC++中使用OpenGL绘制典型曲面
- 在VC++中使用OpenGL绘制典型曲面
- 在VC++中使用OpenGL绘制典型曲面
- 在qt中使用opengl绘制图形动画
- 如何在Unity中使用OpenGL函数绘制动态曲线图
- OpenGL中绘制的机场
- OpenGL中SolidCylinder的绘制
- Windows下使用GetGlyphOutline在OpenGL中渲染字体
- BaiduMap---百度地图官方Demo之OpenGL绘制功能(介绍如何使用OpenGL绘制在地图中进行绘制)
- 使用opengl绘制三角形
- USACO/Healthy Holsteins (经典的DFS题目)
- 图片服务器架构
- The Dialogue Scripts of The Big Bang Theory TV Show Season 5
- POJ 1463——Strategic game
- 用eclipse调试NS2
- OpenGL In C# 03 在OpenGL中使用WPF绘制的字体
- Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记
- 使用filter(过滤器)处理JSP和servlet的中文乱码
- 程序员能力矩阵 你属于哪一层
- Fedora 17 编译安装 kscope-1.6.2
- 山东滨州好地方
- ubuntu常用命令
- CSCOPE 源代码阅读工具
- windows画图常用函数