C# SharpGL初探 长方体贴图 背景色 刷新率 旋转(带贴纸的可旋转长方体)
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初探 长方体贴图 背景色 刷新率 旋转(带贴纸的可旋转长方体)相关推荐
- 知名设计师晒iPad mini 6渲染图:取消Home键 依旧不支持120Hz刷新率
据目前多方透露的消息,苹果将于9月14日举办一年一度的"科技春晚",届时全新的iPhone 13系列旗舰将正式与大家见面,而除此之外,本次发布会上苹果还将推出全新的iPad min ...
- 小米MIX4要来了?真机图曝光:四边等宽曲面屏 120Hz刷新率
本月中旬的小米9 Pro发布会上,小米MIX Alpha技惊四座,引起了广大米粉的热评.然而,作为概念机,小米MIX Alpha毕竟尚未量产,对于期待小米旗舰机型的米粉来说,远水不解近渴,究竟小米MI ...
- 服务器维护之后大角会刷新吗,大角刷新地点(魔兽世界阿克图瑞斯刷新时间)...
请追问,大角可陷阱抓,基本,具体坐标在,lz别被误导了. 位于诺森德灰熊丘陵的,知道的告诉. 凌晨1点的几率能稍微大些每个服务器的刷新时间不一样,诺森德,你好8.这些只是大概刷的时间,355.下午3点 ...
- css 背景图+背景色渐变
1.由于采用rem计算,头部背景图自动适配时,某些机型下背景图底部会有细微的缝隙,造成背景色露底.所以采用背景图+背景色渐变方案.代码如下: .plan-head{padding-left: 1rem ...
- cinrad修改雷达图背景色
cinrad修改雷达图背景色 使用python画出的雷达图背景色一般默认为黑色,若想要将背景色改为白色,需要在cinrad源代码中修改 找到cinrad的安装文件夹,我的装在d盘,路径为 " ...
- echarts词云第一次出现不了数据要刷新才能出现_红米K30 4G版评测:1599元的120Hz屏幕刷新率...
1599 元起.120Hz 屏幕刷新率.前置双挖孔屏.27W 快充,索尼 IMX 686 6400 万像素主摄,高通骁龙 730G 等等,这就是最新发布的 Redmi K30 4G,手机价格一出,一阵 ...
- lcd参数解释及刷新率计算,LCD时序
一.LCD显示图像的过程如下: 其中,VSYNC和HSYNC是有宽度的,加上后如下: 参数解释: HBP(Horizontal Back Porch)水平后沿:在每行或每列的象素数据开始输出时要插入的 ...
- android魅族进度条,魅族基于安卓 10 的首个 Flyme 内测版已推送:16s Pro/16s 尝鲜,可强制开启 90Hz 刷新率...
7 月 21 日消息 据魅族 Flyme 官微消息,基于 Android 10 的 Flyme 首个内测版本已推送. 魅族官方称,本次推送机型为 16s Pro.16s,16th Plus.16th ...
- 常说的手机刷新率60Hz、120Hz有什么不同?
在很长一段时间里,手机的刷新率都是60Hz,随着硬件设备性能的提升,各种高刷新率的移动设备层出不穷,移动端也能有120Hz的显示设备.那么手机上的游戏真的是FPS越高越好吗?本期我们就来探索这其中的真 ...
最新文章
- 洛谷.4234.最小差值生成树(LCT)
- ELK/EFK — 安装部署(主机安装)
- gin自定义HTTP配置
- html5 如何实现客户端验证上传文件的大小
- ORACLE 分区表 PARTITION table
- 基于 WPF 模块化架构下的本地化设计实践
- junit5和junit4_JUnit 5 –架构
- 盘点技术史:流量运营(PC 时代)
- SAP License:ERP系统有哪些?
- Qt学习之路之解决unable to find a qt build,to solve this problem specify a qt build
- 基于Androidstudio的2048小游戏的设计与实现
- SOCKS5协议的原理和应用
- 建立AI智能系统智商评测体系,开展世界人工智能智商评测
- linux swap不可用,linux 禁用 swap
- js二级联动,购物车
- 逢七过,逢七坐,逢七出列。。。 。。。各种叫法都有
- 详解ip地址和mac地址即ARP协议
- 为什么计算机连接不上打印机,为什么电脑连接打印机后却没反应
- win7旗舰版64位占了20多G的内存的清理方法
- 正则表达式(一)认识正则表达式
热门文章
- (原)丰田生产方式与普通生产方式之间的对比(二)
- 三维CAD建模——基于半边数据结构的基本欧拉操作建模
- 关于java生成二维码:QR Code
- 赠书啦!人类视觉计算理论经典著作,豆瓣评分9.7,中文版惊鸿面世!
- LeetCode Algorithm 2326. 螺旋矩阵 IV
- 多个tensor合并成一个——四个三维tensor合成一个四维tensor——四个[3,512,1024]变成[4,3,512,1024]
- 免费视频直播、点播H5播放器SkeyeWebPlayer播放常见问题
- 数据结构小作业——串连接(块链结构)
- 那些页游都是怎么把日流水做到上千万的
- iPhone上用的NVMe闪存,与Android旗舰上用的UFS2.1闪存,各自的优劣是什么?