SharpGL是对OpenGl的C#的封装,支持Net4.0及以上,由于SharpGL仅仅是对C++写的OpenGL做了接口的封装,所以SharpGL的运行效率不用多说,是非常高效的,不会说因为C#是即时性语言而导致性能下降很多,在测试中使用我的笔记本i57300HQ的CPU占用率仅仅0.1%,说明这东西确实运行很高效,虽然没有Unity那样的GPU渲染优化(Unity3D的美化与渲染真的很好),但是这样低的CPU占用率依然很诱人(使用Unity3D时CPU占用率在1.3%~1.6%左右,GPU占用率高,占用线程多),对于轻量级(即便是很简单的一个三维场景,Unity3D一般拖家带口几十Mb甚至上百Mb,而SharpGL则为几Mb)的三维显示,SharpGL无疑是一个很好的选择。因此我在做三维姿态上位机过程中,又学习了一下SharpGL,当然很感谢官方的源码例程,基本所有的操作都是跟着官方例程来的。在这里分享一下:
本文ShaprGL WPF工程链接

安装SharpGL-1.vsix

这个会自动安装到当前的VS中,安装包链接

创建一个SharpGL的WPF窗体:

xaml文件:

<Window x:Class="SharpGLWPFApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="SharpGL WPF Application" Height="554" Width="800" xmlns:sharpGL="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF"><Grid><!-- The OpenGL control provides a OpenGL drawing surface. --><sharpGL:OpenGLControl Name="openGLControl" OpenGLDraw="openGLControl_OpenGLDraw" OpenGLInitialized="openGLControl_OpenGLInitialized" Resized="openGLControl_Resized"DrawFPS="false" RenderContextType="FBO" FrameRate="20" Margin="0,0,0.4,-0.2"/><Button Content="暂停/继续" FontSize="28" HorizontalAlignment="Left" Width="135" Margin="0,435,0,0" Click="Button_Click"/></Grid>
</Window>

设计完大概这样:

设置背景色:

当然你觉得黑色不好看的话可换个纯色背景,只需要改改这句话就可以了(其中的透明度好像不能用,设置了好像也没什么变化,前三个RGB值是可以使用的,像我这样设置的话是藏蓝色的):

gl.ClearColor(0.1f, 0.2f,0.3f, 0.01f);//RGB值和透明度

贴图代码:

当然,贴图有两种方式,当然,我推荐简单的一种(虽然我在工程中没有这样做,┗( ▔, ▔ )┛)
简单的版本:

using SharpGL.SceneGraph.Assets;
OpenGL gl = openGLControl.OpenGL;
Texture[] mytexture = new Texture[6];//创建6个面的贴图
mytexture[0].Create(gl, "Pictures/Right.png");//依次生成贴图
...
...
...

一定需要注意的是,贴图前一定要保证已经使能了贴图功能,不然是贴不上去的,必须要有这一句话:

gl.Enable(OpenGL.GL_TEXTURE_2D);

然后就是贴图了,需要注意的是,贴图是
以 gl.Begin(OpenGL.GL_QUADS);开始
以 gl.End();结束
所以贴不同的面都要添上这两句
贴图中用到的三个函数的参数说明为:
/* gl.Normal3i(1, 0, 0); 四边形面的法向量*/
/gl.TexCoord(0, 0); 第一个参数是X坐标,0.0是纹理的左侧,0.5是纹理的中点,1.0是纹理的右侧。第二个参数是Y坐标,0.0是纹理的底部,0.5是纹理的中点,1.0是纹理的顶部/
/gl.Vertex(halfXdimension, -halfYdimension, -halfZdimension); 绘制的四边形的顶点的坐标/

 OpenGL gl = openGLControl.OpenGL;;gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);    // Clear screen and DepthBuffergl.LoadIdentity();gl.PolygonMode(OpenGL.GL_FRONT, OpenGL.GL_FILL);//设置照相机的位置gl.Translate(0, 0, -1.0f * CameraDistance);switch (CameraView){case (CameraViews.Right):gl.Rotate(-90, 0, 1, 0);gl.Rotate(-90, 1, 0, 0);break;case (CameraViews.Left):gl.Rotate(90, 0, 1, 0);gl.Rotate(-90, 1, 0, 0);break;case (CameraViews.Back):gl.Rotate(90, 1, 0, 0);gl.Rotate(180, 0, 1, 0);break;case (CameraViews.Front):gl.Rotate(-90, 1, 0, 0);break;case (CameraViews.Top):break;case (CameraViews.Bottom):gl.Rotate(180, 1, 0, 0);break;}gl.PushMatrix();//使用旋转矩阵旋转//gl.glMultMatrixf(transformationMatrix); //根据旋转矩阵旋转方块//根据欧拉角旋转/*绕 X 轴旋转  Y->Z  为正*/           /*绕 Y 轴旋转  Z->X  为正*/           /*绕 Z 轴旋转  X->Y  为正*/gl.Rotate((float)angle, 1, 0, 0);     gl.Rotate((float)angle, 0, 1, 0);     gl.Rotate((float)angle, 0, 0, 1);// +'ve x facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]);//绑定贴图gl.Begin(OpenGL.GL_QUADS);//开始四边形/* gl.Normal3i(1, 0, 0); 法向量*//*gl.TexCoord(0, 0); 第一个参数是X坐标,0.0是纹理的左侧,0.5是纹理的中点,1.0是纹理的右侧。第二个参数是Y坐标,0.0是纹理的底部,0.5是纹理的中点,1.0是纹理的顶部*//*gl.Vertex(halfXdimension, -halfYdimension, -halfZdimension); 坐标取决于摄像机位置 */gl.Normal3i(1, 0, 0); gl.TexCoord(0, 0); gl.Vertex(halfXdimension, -halfYdimension, -halfZdimension);gl.Normal3i(1, 0, 0); gl.TexCoord(0, 1); gl.Vertex(halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(1, 0, 0); gl.TexCoord(1, 1); gl.Vertex(halfXdimension, halfYdimension, halfZdimension);gl.Normal3i(1, 0, 0); gl.TexCoord(1, 0); gl.Vertex(halfXdimension, halfYdimension, -halfZdimension);gl.End();// -'ve x facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[1]);gl.Begin(OpenGL.GL_QUADS);gl.Normal3i(-1, 0, 0); gl.TexCoord(1, 0); gl.Vertex(-halfXdimension, -halfYdimension, -halfZdimension);gl.Normal3i(-1, 0, 0); gl.TexCoord(1, 1); gl.Vertex(-halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(-1, 0, 0); gl.TexCoord(0, 1); gl.Vertex(-halfXdimension, halfYdimension, halfZdimension);gl.Normal3i(-1, 0, 0); gl.TexCoord(0, 0); gl.Vertex(-halfXdimension, halfYdimension, -halfZdimension);gl.End();// +'ve y facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[2]);gl.Begin(OpenGL.GL_QUADS);gl.Normal3i(0, 1, 0); gl.TexCoord(1, 0); gl.Vertex(-halfXdimension, halfYdimension, -halfZdimension);gl.Normal3i(0, 1, 0); gl.TexCoord(1, 1); gl.Vertex(-halfXdimension, halfYdimension, halfZdimension);gl.Normal3i(0, 1, 0); gl.TexCoord(0, 1); gl.Vertex(halfXdimension, halfYdimension, halfZdimension);gl.Normal3i(0, 1, 0); gl.TexCoord(0, 0); gl.Vertex(halfXdimension, halfYdimension, -halfZdimension);gl.End();// -'ve y facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[3]);gl.Begin(OpenGL.GL_QUADS);gl.Normal3i(0, -1, 0); gl.TexCoord(0, 0); gl.Vertex(-halfXdimension, -halfYdimension, -halfZdimension);gl.Normal3i(0, -1, 0); gl.TexCoord(0, 1); gl.Vertex(-halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(0, -1, 0); gl.TexCoord(1, 1); gl.Vertex(halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(0, -1, 0); gl.TexCoord(1, 0); gl.Vertex(halfXdimension, -halfYdimension, -halfZdimension);gl.End();// +'ve z facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[4]);gl.Begin(OpenGL.GL_QUADS);gl.Normal3i(0, 0, 1); gl.TexCoord(0, 0); gl.Vertex(-halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(0, 0, 1); gl.TexCoord(1, 0); gl.Vertex(halfXdimension, -halfYdimension, halfZdimension);gl.Normal3i(0, 0, 1); gl.TexCoord(1, 1); gl.Vertex(halfXdimension, halfYdimension, halfZdimension);gl.Normal3i(0, 0, 1); gl.TexCoord(0, 1); gl.Vertex(-halfXdimension, halfYdimension, halfZdimension);gl.End();// -'ve z facegl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[5]);gl.Begin(OpenGL.GL_QUADS);gl.Normal3i(0, 0, -1); gl.TexCoord(0, 1); gl.Vertex(-halfXdimension, -halfYdimension, -halfZdimension);gl.Normal3i(0, 0, -1); gl.TexCoord(1, 1); gl.Vertex(halfXdimension, -halfYdimension, -halfZdimension);gl.Normal3i(0, 0, -1); gl.TexCoord(1, 0); gl.Vertex(halfXdimension, halfYdimension, -halfZdimension);gl.Normal3i(0, 0, -1); gl.TexCoord(0, 0); gl.Vertex(-halfXdimension, halfYdimension, -halfZdimension);gl.End();gl.PopMatrix();gl.Flush();

最终的实现效果:

设置刷新率:

SharpGL是一个非常的人性化的设置,可以直接调节刷新率,也就省去了开启一个定时器,使用定时器来进行软刷新了,基本省去了定时器的麻烦,反正就是相当于他帮你开启了一个定时器,如果想调节定时器刷新频率的话,很简单,只需要在xaml里修改一下参数就可以了。将FrameRate="20"中的20改成你想要的刷新频率,单位是Hz,不过这个速率我试了下超过100Hz好像就没什么变化了,有可能是人家觉得不需要那么高的刷新率,反正实际FPS的需要也不需要太高吧。
或者这样做也行,添加一句:

openGLControl.FrameRate = 20;//这个20就是FPS可以随便改

C# SharpGL初探 长方体贴图 背景色 刷新率 旋转(带贴纸的可旋转长方体)相关推荐

  1. 知名设计师晒iPad mini 6渲染图:取消Home键 依旧不支持120Hz刷新率

    据目前多方透露的消息,苹果将于9月14日举办一年一度的"科技春晚",届时全新的iPhone 13系列旗舰将正式与大家见面,而除此之外,本次发布会上苹果还将推出全新的iPad min ...

  2. 小米MIX4要来了?真机图曝光:四边等宽曲面屏 120Hz刷新率

    本月中旬的小米9 Pro发布会上,小米MIX Alpha技惊四座,引起了广大米粉的热评.然而,作为概念机,小米MIX Alpha毕竟尚未量产,对于期待小米旗舰机型的米粉来说,远水不解近渴,究竟小米MI ...

  3. 服务器维护之后大角会刷新吗,大角刷新地点(魔兽世界阿克图瑞斯刷新时间)...

    请追问,大角可陷阱抓,基本,具体坐标在,lz别被误导了. 位于诺森德灰熊丘陵的,知道的告诉. 凌晨1点的几率能稍微大些每个服务器的刷新时间不一样,诺森德,你好8.这些只是大概刷的时间,355.下午3点 ...

  4. css 背景图+背景色渐变

    1.由于采用rem计算,头部背景图自动适配时,某些机型下背景图底部会有细微的缝隙,造成背景色露底.所以采用背景图+背景色渐变方案.代码如下: .plan-head{padding-left: 1rem ...

  5. cinrad修改雷达图背景色

    cinrad修改雷达图背景色 使用python画出的雷达图背景色一般默认为黑色,若想要将背景色改为白色,需要在cinrad源代码中修改 找到cinrad的安装文件夹,我的装在d盘,路径为 " ...

  6. echarts词云第一次出现不了数据要刷新才能出现_红米K30 4G版评测:1599元的120Hz屏幕刷新率...

    1599 元起.120Hz 屏幕刷新率.前置双挖孔屏.27W 快充,索尼 IMX 686 6400 万像素主摄,高通骁龙 730G 等等,这就是最新发布的 Redmi K30 4G,手机价格一出,一阵 ...

  7. lcd参数解释及刷新率计算,LCD时序

    一.LCD显示图像的过程如下: 其中,VSYNC和HSYNC是有宽度的,加上后如下: 参数解释: HBP(Horizontal Back Porch)水平后沿:在每行或每列的象素数据开始输出时要插入的 ...

  8. android魅族进度条,魅族基于安卓 10 的首个 Flyme 内测版已推送:16s Pro/16s 尝鲜,可强制开启 90Hz 刷新率...

    7 月 21 日消息 据魅族 Flyme 官微消息,基于 Android 10 的 Flyme 首个内测版本已推送. 魅族官方称,本次推送机型为 16s Pro.16s,16th Plus.16th ...

  9. 常说的手机刷新率60Hz、120Hz有什么不同?

    在很长一段时间里,手机的刷新率都是60Hz,随着硬件设备性能的提升,各种高刷新率的移动设备层出不穷,移动端也能有120Hz的显示设备.那么手机上的游戏真的是FPS越高越好吗?本期我们就来探索这其中的真 ...

最新文章

  1. 洛谷.4234.最小差值生成树(LCT)
  2. ELK/EFK — 安装部署(主机安装)
  3. gin自定义HTTP配置
  4. html5 如何实现客户端验证上传文件的大小
  5. ORACLE 分区表 PARTITION table
  6. 基于 WPF 模块化架构下的本地化设计实践
  7. junit5和junit4_JUnit 5 –架构
  8. 盘点技术史:流量运营(PC 时代)
  9. SAP License:ERP系统有哪些?
  10. Qt学习之路之解决unable to find a qt build,to solve this problem specify a qt build
  11. 基于Androidstudio的2048小游戏的设计与实现
  12. SOCKS5协议的原理和应用
  13. 建立AI智能系统智商评测体系,开展世界人工智能智商评测
  14. linux swap不可用,linux 禁用 swap
  15. js二级联动,购物车
  16. 逢七过,逢七坐,逢七出列。。。 。。。各种叫法都有
  17. 详解ip地址和mac地址即ARP协议
  18. 为什么计算机连接不上打印机,为什么电脑连接打印机后却没反应
  19. win7旗舰版64位占了20多G的内存的清理方法
  20. 正则表达式(一)认识正则表达式

热门文章

  1. (原)丰田生产方式与普通生产方式之间的对比(二)
  2. 三维CAD建模——基于半边数据结构的基本欧拉操作建模
  3. 关于java生成二维码:QR Code
  4. 赠书啦!人类视觉计算理论经典著作,豆瓣评分9.7,中文版惊鸿面世!
  5. LeetCode Algorithm 2326. 螺旋矩阵 IV
  6. 多个tensor合并成一个——四个三维tensor合成一个四维tensor——四个[3,512,1024]变成[4,3,512,1024]
  7. 免费视频直播、点播H5播放器SkeyeWebPlayer播放常见问题
  8. 数据结构小作业——串连接(块链结构)
  9. 那些页游都是怎么把日流水做到上千万的
  10. iPhone上用的NVMe闪存,与Android旗舰上用的UFS2.1闪存,各自的优劣是什么?