本文属于 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 垂直同步即可进行高速刷新

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取源代码,先创建一个空文件夹,接着使用命令行 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. (1)《QT+OpenGL学习之我见》初始化窗口及三个重要函数 vs+Qt

    本章前言:本章讲如何利用VS和QT来创建一个基本的QOpenGLWidget窗口和有关联的三个核心函数,因为版本更新可能会有大同小异,但基本的不会有变换,有了QT的帮助,我们不需要下载opengL.g ...

  2. selenium入门14 窗口切换

    窗口切换: 当前窗口句柄 current_window_handle 所有的窗口句柄 window_handles 切换窗口 switch_to_window() #coding=utf-8 #切换窗 ...

  3. vue入门--初始化

    VUE初始化时,可以用vue init webpack-simple或者vue init webpack.前者是简易版的工程,后者是标准的初始化.工程创建成功后,打开发现两个的目录结构有很大不同.si ...

  4. windows服务器入门 初始化数据盘

    本人在寒假的时候自行搭建了一个服务器,在此分享一下我的方法.本人服务器的系统为Windows 2012R2 在后面的讲解中中文英文都会有    所以不用在意系统的语言问题 1)第一步  自然就是打开服 ...

  5. APICloud 入门教程窗口篇

    什么是窗口,窗口可以理解为一屏幕内容的一个基本载体,里面可以放导航,图片,视频,文字等组成一屏幕内容. 不同的窗口组成一个APP, 例如购物APP有[首页],[购物车],[我的]等不同的窗口.不同的窗 ...

  6. DirectX11 With Windows SDK--01 DirectX11初始化

    前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...

  7. Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器

    Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...

  8. Caliburn.Micro 杰的入门教程1(翻译)

    Caliburn.Micro 杰的入门教程1(原创翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程 ...

  9. Kendo UI for jQuery自定义小部件第一弹!不得不看的入门指南

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  10. Kendo UI for jQuery使用教程:初始化jQuery插件

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

随机推荐

  1. Python glob库的用法

    一.匹配指定文件夹下的所有文件 files = glob.glob("C:\\Users\\liuchunlin2\\Desktop\\测试数据\\*") print(files) ...

  2. 如何用LOTO示波器实测LC串联谐振?

    一个电感和一个电容串联,在某个特定的频率,就会发生谐振,这个频率就是谐振频率.串联谐振电路有如下特点: 谐振时整个电路阻抗呈电阻性,阻抗最小,电流达到最大: 谐振时电感和电容两端的电压达到最大. 上图 ...

  3. C# OpenCvSharp 轮廓检测

    效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  4. management.endpoints.web.exposure.include

    yml配置文件中 management: endpoints: web: exposure: include: '*' properties配置文件中 management.endpoints.web ...

  5. KingbaseES数据库-生产环境慢查询性能优化案例

    一.背景 在生产环境中,慢查询不仅影响系统.业务的正常处理.同时严重影响用户的使用感受. 二.表相关信息 2.1 表结构及索引: Table "yktcore.t_dtl_ymt" ...

  6. KingbaseES V8R6 fillfactor 对于表的影响

    前言 fillfactor 表的填充因子是一个介于 10 和 100 之间的百分数.100是默认值.如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页.每个页上的剩余空间将用 ...

  7. Python实现结巴分词统计高频中文词汇

    代码 1 # 读取文件 2 fn = open('youxi.txt', 'rt', encoding='utf-8') # 打开文件 3 string_data = fn.read() # 读出整个 ...

  8. 【已解决】启动Hmaster失败 master.HMaster: Unhandled exception. Starting shutdown.

  9. 链表栈(LinkedListStack)

      链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点.因为栈具有"后进先出"的特点,如果每次在链表的尾部进行插入和删除,就要遍 ...

  10. 取消掉远程桌面mstsc顶部(侧面)连接栏

    在进行mstsc远程桌面连接电脑或者虚拟机的时候,总是会出现一个连接栏.虽然点左边的图钉可以自动隐藏,但是每次鼠标滑到上面的时候,还是会冒出来,这个就有点闹心了. 查了下相关资料,解决了,特写下相关教 ...