OpenTK 入门 初始化窗口
本文属于 OpenTK 入门博客,这是一项使用 C# 做底层调用 OpenGL 和 OpenAL 和 OpenCL 的技术。但值得一提的是,如果是想做渲染相关的话,当前是不建议使用 OpenGL 的,无论是从性能上还是其他方面,都不具备优势
本文将从控制台开始,初始化创建窗口,在窗口里面承载 OpenGL 的内容。创建 OpenGL 空窗口的方式有很多,与之相关的是采用 Silk.NET 库创建 OpenGL 窗口,详细请看 使用 Silk.NET 创建 OpenGL 空窗口项目例子
先新建一个 .NET 7 的控制台应用,接着按照 dotnet 的惯例,安装上 OpenTK 的 NuGet 库。对于 .NET 7 项目,项目文件使用 SDK 风格的 csproj 格式,可以在 VisualStudio 里双击项目进入编辑 csproj 文件,在 csproj 文件里加上以下代码用来安装库
<ItemGroup>
<PackageReference Include="OpenTK" Version="4.7.7" />
</ItemGroup>
修改之后的 csproj 项目文件的代码如下
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenTK" Version="4.7.7" />
</ItemGroup>
</Project>
完成安装 NuGet 库之后,进入到 Program.cs 文件里,为了方便后续编写代码,先引用命名空间
using OpenTK;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Common.Input;
using OpenTK.Windowing.Desktop;
接着开始编写一个用来承载 OpenGL 的窗口,代码如下
public sealed class MainWindow : GameWindow
{
public MainWindow(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings)
{
}
}
为了体现承载 OpenGL 效果,咱接下来重写 OnRenderFrame 方法,在这个方法里面修改背景色
public sealed class MainWindow : GameWindow
{
public MainWindow(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings)
{
}
protected override void OnRenderFrame(FrameEventArgs args)
{
Title = $"(Vsync: {VSync}) FPS: {1f / args.Time:0}";
Color4 backColor;
backColor.A = 1.0f;
backColor.R = Random.Shared.NextSingle();
backColor.G = Random.Shared.NextSingle();
backColor.B = Random.Shared.NextSingle();
GL.ClearColor(backColor);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
SwapBuffers();
}
}
以上代码可以将 FPS 输出到窗口标题,且修改窗口的背景色
完成窗口定义之后,就可以在 Main 函数跑起来,代码如下
internal class Program
{
static void Main(string[] args)
{
var mainWindow = new MainWindow(new GameWindowSettings()
{
RenderFrequency = 0,
}, new NativeWindowSettings()
{
Size = new Vector2i(1000, 1000 / 2),
Title = "OpenTK",
Vsync = VSyncMode.Off
});
mainWindow.Run();
}
}
跑起来的时候设置 RenderFrequency 为 0 就是告诉应用,用尽可能快的刷新速度,再关闭 Vsync 垂直同步即可进行高速刷新
可以通过如下方式获取源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 6b04d4bc03c379f776ac4d372833ca1118cb9343
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 6b04d4bc03c379f776ac4d372833ca1118cb9343
获取代码之后,进入 NaeawurcaDowhemcenunalfe 文件夹
我创建了一个 OpenTK 技术讨论群: 789025426 欢迎加入
更多渲染相关,请参阅 博客导航
OpenTK 入门 初始化窗口的更多相关文章
- (1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt
本章前言:本章讲如何利用VS和QT来创建一个基本的QOpenGLWidget窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了QT的帮助,我们不需要下载opengL.g ...
- selenium入门14 窗口切换
窗口切换: 当前窗口句柄 current_window_handle 所有的窗口句柄 window_handles 切换窗口 switch_to_window() #coding=utf-8 #切换窗 ...
- vue入门--初始化
VUE初始化时,可以用vue init webpack-simple或者vue init webpack.前者是简易版的工程,后者是标准的初始化.工程创建成功后,打开发现两个的目录结构有很大不同.si ...
- windows服务器入门 初始化数据盘
本人在寒假的时候自行搭建了一个服务器,在此分享一下我的方法.本人服务器的系统为Windows 2012R2 在后面的讲解中中文英文都会有 所以不用在意系统的语言问题 1)第一步 自然就是打开服 ...
- APICloud 入门教程窗口篇
什么是窗口,窗口可以理解为一屏幕内容的一个基本载体,里面可以放导航,图片,视频,文字等组成一屏幕内容. 不同的窗口组成一个APP, 例如购物APP有[首页],[购物车],[我的]等不同的窗口.不同的窗 ...
- DirectX11 With Windows SDK--01 DirectX11初始化
前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...
- Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- Caliburn.Micro 杰的入门教程1(翻译)
Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...
- Kendo UI for jQuery自定义小部件第一弹!不得不看的入门指南
Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...
- Kendo UI for jQuery使用教程:初始化jQuery插件
[Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...
随机推荐
- 记录--极致舒适的Vue页面保活方案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了让页面保活更加稳定,你们是怎么做的? 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后,可以在返回时恢复上一次浏览页面的状态 ...
- JavaScript知识总结 终结篇--面向对象,垃圾回收与内存泄漏
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.面向对象 一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大量相似对象的时候,会产生大量的重复代码.但 js和一般的面向对象 ...
- linux安装jdk压缩包版
1.下载压缩包可以选择国内大厂的jdk镜像网站下载速度很快, 比如华为的:https://repo.huaweicloud.com/java/jdk/ 2.查看Linux系统是否有自带的jdk: 输入 ...
- KingbaseES V8R6 创建索引create index concurrently被阻塞
前言 CREATE INDEX CONCURRENTLY(CIC)是DBA们最常用的语句之一,它的好处是不阻塞DML语句. 但在大事务.长事务较多的系统,它可能被阻塞得很久. 本篇就从这个阻塞的案例开 ...
- KingbaseES V8R6 集群运维系列--archive_cleanup_command参数应用
案例说明: 参数archive_cleanup_command可以配置在kingbase.conf文件中,用于备库清理不在需要的归档日志,参数详细说明见下图: https://postgresql ...
- 通过位运算修改指定bit位的值
通过位运算将指定位的值置0或1 问题样例 假如现在有一个8bit二进制数A,其可以为任何值,所以这里不妨先设A=(xxxxxxxx)2,{x|0,1} 现在需要你将A的几个指定位修改为1或0,例如将A ...
- 【WCH以太网接口系列芯片】CH9121\20的使用和测试
本篇文章将介绍沁恒微电子的以太网转接芯片CH9121(CH9120和CH9121使用上没有区别,注意配置工具不一样,可以在沁恒微电子官网自行下载测试),该芯片支持网口和串口相互透传,可以通过串口AT指 ...
- #模拟#洛谷 2327 [SCOI2005]扫雷
题目 分析 考虑最多只有两种情况,因为确定一个位置其它位置随即也能确定, 那么指定第一个位置有没有雷然后判断一下后面推出的雷数是否为0或1,不是显然不行 代码 #include <cstdio& ...
- OpenHarmony Meetup 深圳站招募令
OpenHarmony Meetup城市巡回深圳站火热来袭!! 日期:2023年10月15日14:00 地点:深圳市福田区上步路中路1003号 深圳市科学馆 与OpenHarmony技术大咖近距离 ...
- 前端使用 Konva 实现可视化设计器(3)
github/gitee Star 终于有几个了! 从这章开始,难度算是(或者说细节较多)升级,是不是值得更多的 Star 呢?! 继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~ 创作 ...